mirror of https://github.com/itsmrval/subway
Compare commits
9 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
dce7330f73 | |
|
|
db71adc9f2 | |
|
|
9d36d93ad6 | |
|
|
ee12ab5324 | |
|
|
9801bc99d9 | |
|
|
c80e41c953 | |
|
|
8d942f4e78 | |
|
|
ca48276b2b | |
|
|
3e4cb6ddd9 |
|
|
@ -30,7 +30,7 @@ Note: This app is not intended for production use, but for personal or education
|
|||
This section list major frameworks/libraries used
|
||||
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
* 
|
||||
|
||||
<p align="right">(<a href="#readme-top">back to top</a>)</p>
|
||||
|
|
@ -74,7 +74,9 @@ Then, create a user with a database
|
|||
<p align="right">(<a href="#readme-top">back to top</a>)</p>
|
||||
|
||||
|
||||
## Known issues
|
||||
|
||||
- Some stations with RER A doesnt display timetables
|
||||
|
||||
|
||||
## License
|
||||
|
|
|
|||
|
|
@ -48,9 +48,9 @@ $userDetails = getUserDetails($_SESSION['user_id']);
|
|||
<?php
|
||||
echo $_SESSION['message'] ?? '';
|
||||
unset($_SESSION['message']);
|
||||
?>
|
||||
<h2 class="mb-4">Edit Account</h2>
|
||||
<form method="POST" action="">
|
||||
?>
|
||||
<h2 class="mb-4">Edit Account</h2>
|
||||
<form method="POST" action="">
|
||||
<div class="mb-3">
|
||||
<label for="email" class="form-label">Email</label>
|
||||
<input type="email" class="form-control" id="email" name="email" value="<?php echo htmlspecialchars($userDetails['email']); ?>" placeholder="Enter your email" required>
|
||||
|
|
@ -69,5 +69,39 @@ $userDetails = getUserDetails($_SESSION['user_id']);
|
|||
<small class="form-text text-muted">Leave blank if you do not want to change the password</small>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">Save Changes</button>
|
||||
</form>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
||||
<?php
|
||||
function getUserLogs($userId) {
|
||||
global $conn;
|
||||
try {
|
||||
$query = $conn->prepare("SELECT logs.ip, logs.date, users.email FROM logs JOIN users ON logs.userId = users.id WHERE logs.userId = ?");
|
||||
$query->execute([$userId]);
|
||||
return $query->fetchAll(PDO::FETCH_ASSOC);
|
||||
} catch(PDOException $e) {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
$logDetails = getUserLogs($_SESSION['user_id']);
|
||||
?>
|
||||
<table class="table mt-4">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>IP</th>
|
||||
<th>Date</th>
|
||||
<th>Email</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php foreach ($logDetails as $log): ?>
|
||||
<tr>
|
||||
<td><?php echo $log['ip']; ?></td>
|
||||
<td><?php echo $log['date']; ?></td>
|
||||
<td><?php echo $log['email']; ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
|
|||
|
|
@ -12,8 +12,8 @@ function getStopName($stopId) {
|
|||
function getFavorites($lineId) {
|
||||
global $conn;
|
||||
try {
|
||||
$query = $conn->prepare("SELECT stopId FROM favorites WHERE lineId = ?");
|
||||
$query->execute([$lineId]);
|
||||
$query = $conn->prepare("SELECT stopId FROM favorites WHERE lineId = ? AND userId = ?");
|
||||
$query->execute([$lineId, $_SESSION['user_id']]);
|
||||
$result = $query->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
return $result;
|
||||
|
|
|
|||
|
|
@ -13,18 +13,22 @@ $directions = [];
|
|||
if (isset($data['Siri']['ServiceDelivery']['StopMonitoringDelivery'][0]['MonitoredStopVisit'])) {
|
||||
foreach ($data['Siri']['ServiceDelivery']['StopMonitoringDelivery'][0]['MonitoredStopVisit'] as $visit) {
|
||||
$vehicleJourney = $visit['MonitoredVehicleJourney'];
|
||||
if (isset($vehicleJourney['MonitoredCall']['ExpectedArrivalTime'])) {
|
||||
$direction = $vehicleJourney['DirectionName'][0]['value'];
|
||||
$expectedArrival = $vehicleJourney['MonitoredCall']['ExpectedArrivalTime'];
|
||||
$expectedDeparture = $vehicleJourney['MonitoredCall']['ExpectedDepartureTime'];
|
||||
if (strpos($vehicleJourney['OperatorRef']['value'], '.' . $lineId . '.' . $lineId . ':')) {
|
||||
if (isset($vehicleJourney['MonitoredCall']['ExpectedDepartureTime'])) {
|
||||
$direction = $vehicleJourney['DestinationName'][0]['value'];
|
||||
$expectedDeparture = $vehicleJourney['MonitoredCall']['ExpectedDepartureTime'];
|
||||
|
||||
$departureTime = date('H:i', strtotime($expectedArrival . ' +2 hours'));
|
||||
$departureTime = date('H:i', strtotime($expectedDeparture . ' +2 hours'));
|
||||
$currentTime = date('H:i', strtotime('now' . ' +2 hours'));
|
||||
|
||||
if (!isset($directions[$direction])) {
|
||||
$directions[$direction] = [];
|
||||
}
|
||||
if (count($directions[$direction]) < 2) {
|
||||
$directions[$direction][] = $departureTime;
|
||||
if ($departureTime > $currentTime) {
|
||||
if (!isset($directions[$direction])) {
|
||||
$directions[$direction] = [];
|
||||
}
|
||||
if (count($directions[$direction]) < 2) {
|
||||
$directions[$direction][] = $departureTime;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,9 +13,10 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
|||
$_SESSION['is_admin'] = $user['is_admin'];
|
||||
header("Location: /");
|
||||
|
||||
$log = $conn->prepare("INSERT INTO logs (userId, date) VALUES (:userId, :date)");
|
||||
$log = $conn->prepare("INSERT INTO logs (userId, date, ip) VALUES (:userId, :date, :ip)");
|
||||
$log->bindParam(':userId', $user['id']);
|
||||
$log->bindParam(':date', date('Y-m-d-H-i-s'));
|
||||
$log->bindParam(':ip', $_SERVER['REMOTE_ADDR']);
|
||||
$log->execute();
|
||||
} else {
|
||||
$errorMessage = "Invalid email or password.";
|
||||
|
|
|
|||
|
|
@ -91,11 +91,11 @@ document.addEventListener('DOMContentLoaded', function() {
|
|||
if (action === 'add') {
|
||||
buttonElement.classList.remove('add-stop', 'btn-success');
|
||||
buttonElement.classList.add('remove-stop', 'btn-danger');
|
||||
buttonElement.textContent = 'Retirer';
|
||||
buttonElement.textContent = 'Revoke';
|
||||
} else {
|
||||
buttonElement.classList.remove('remove-stop', 'btn-danger');
|
||||
buttonElement.classList.add('add-stop', 'btn-success');
|
||||
buttonElement.textContent = 'Ajouter';
|
||||
buttonElement.textContent = 'Add';
|
||||
}
|
||||
buttonElement.removeEventListener('click', arguments.callee);
|
||||
buttonElement.addEventListener('click', arguments.callee);
|
||||
|
|
|
|||
|
|
@ -14,25 +14,30 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
|
|||
}
|
||||
|
||||
if (!isset($errorMessage)) {
|
||||
$query = $conn->prepare("INSERT INTO users (firstName, lastName, email, password) VALUES (:firstName, :lastName, :email, :password)");
|
||||
$query->bindParam(':firstName', $_POST['firstName']);
|
||||
$query->bindParam(':lastName', $_POST['lastName']);
|
||||
$query->bindParam(':email', $_POST['email']);
|
||||
$query->bindParam(':password', password_hash($_POST['password'], PASSWORD_DEFAULT));
|
||||
$query->execute();
|
||||
|
||||
$query = $conn->prepare("SELECT COUNT(*) as count FROM users");
|
||||
$query->execute();
|
||||
$result = $query->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if ($result['count'] == 1) {
|
||||
$query = $conn->prepare("UPDATE users SET is_admin = 1 WHERE email = :email");
|
||||
try {
|
||||
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
|
||||
$query = $conn->prepare("INSERT INTO users (firstName, lastName, email, password) VALUES (:firstName, :lastName, :email, :password)");
|
||||
$query->bindParam(':firstName', $_POST['firstName']);
|
||||
$query->bindParam(':lastName', $_POST['lastName']);
|
||||
$query->bindParam(':email', $_POST['email']);
|
||||
$query->bindParam(':password', $password);
|
||||
$query->execute();
|
||||
}
|
||||
|
||||
header("Location: login.php");
|
||||
exit();
|
||||
$query = $conn->prepare("SELECT COUNT(*) as count FROM users");
|
||||
$query->execute();
|
||||
$result = $query->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if ($result['count'] == 1) {
|
||||
$query = $conn->prepare("UPDATE users SET is_admin = 1 WHERE email = :email");
|
||||
$query->bindParam(':email', $_POST['email']);
|
||||
$query->execute();
|
||||
}
|
||||
|
||||
header("Location: login.php");
|
||||
exit();
|
||||
} catch (PDOException $e) {
|
||||
$errorMessage = "Please fill correct values";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,7 +3,8 @@
|
|||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Subway schedules</title>
|
||||
<title>Subway</title>
|
||||
<link rel="icon" href="assets/logo/favicon.png">
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
|
||||
<?php
|
||||
if (!isset($_SESSION['user_id'])) {
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
Binary file not shown.
|
After Width: | Height: | Size: 42 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 20 KiB |
|
|
@ -11,11 +11,17 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['stopId'], $_POST['lin
|
|||
|
||||
try {
|
||||
if ($action === 'add') {
|
||||
$stmt = $conn->prepare("INSERT INTO favorites (userId, stopId, lineId) VALUES (?, ?, ?)");
|
||||
$stmt->execute([$userId, $stopId, $lineId]);
|
||||
$query = $conn->prepare("SELECT * FROM favorites WHERE userId = ? AND stopId = ? AND lineId = ?");
|
||||
$query->execute([$userId, $stopId, $lineId]);
|
||||
$existingFavorite = $query->fetch();
|
||||
|
||||
if (!$existingFavorite) {
|
||||
$query = $conn->prepare("INSERT INTO favorites (userId, stopId, lineId) VALUES (?, ?, ?)");
|
||||
$query->execute([$userId, $stopId, $lineId]);
|
||||
}
|
||||
} elseif ($action === 'remove') {
|
||||
$stmt = $conn->prepare("DELETE FROM favorites WHERE userId = ? AND stopId = ? AND lineId = ?");
|
||||
$stmt->execute([$userId, $stopId, $lineId]);
|
||||
$query = $conn->prepare("DELETE FROM favorites WHERE userId = ? AND stopId = ? AND lineId = ?");
|
||||
$query->execute([$userId, $stopId, $lineId]);
|
||||
}
|
||||
echo json_encode(['success' => true]);
|
||||
} catch (PDOException $e) {
|
||||
|
|
|
|||
|
|
@ -11,7 +11,10 @@ try {
|
|||
lastName VARCHAR(50) NOT NULL,
|
||||
email VARCHAR(100) NOT NULL UNIQUE,
|
||||
password VARCHAR(255) NOT NULL,
|
||||
is_admin BOOLEAN NOT NULL DEFAULT 0
|
||||
is_admin BOOLEAN NOT NULL DEFAULT 0,
|
||||
CHECK (LENGTH(firstName) >= 2),
|
||||
CHECK (LENGTH(lastName) >= 2),
|
||||
CHECK (email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')
|
||||
)");
|
||||
|
||||
$conn->exec("CREATE TABLE IF NOT EXISTS favorites (
|
||||
|
|
@ -24,6 +27,7 @@ try {
|
|||
$conn->exec("CREATE TABLE IF NOT EXISTS logs (
|
||||
userId INT NOT NULL,
|
||||
date DATETIME NOT NULL,
|
||||
ip VARCHAR(255) NOT NULL,
|
||||
FOREIGN KEY (userId) REFERENCES users(id)
|
||||
)");
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue