Compare commits

...

9 Commits
v1.0.0 ... main

Author SHA1 Message Date
Valentin dce7330f73 fix(homepage) miss removing previous fix 2024-06-22 21:25:48 +02:00
Valentin db71adc9f2 fix(favicon) new icon 2024-06-22 21:19:32 +02:00
Valentin 9d36d93ad6
Update README.MD 2024-06-22 21:03:33 +02:00
Valentin ee12ab5324 fix(home) displaying users favorites... 2024-06-19 17:51:40 +02:00
Maxime H 9801bc99d9
fix(issues) 2024-06-19 17:49:31 +02:00
Valentin c80e41c953 fix(home) direction for 3 branches 2024-06-19 17:08:35 +02:00
Valentin 8d942f4e78 fix(register) fix check request 2024-06-17 11:28:49 +02:00
Maxime H ca48276b2b Add 3 checks 2024-06-17 11:02:42 +02:00
Valentin 3e4cb6ddd9 feat(logs) displaying logs on account page 2024-06-17 10:59:03 +02:00
13 changed files with 103 additions and 46 deletions

View File

@ -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 This section list major frameworks/libraries used
* ![](https://img.shields.io/badge/php-20232A?style=for-the-badge&logo=php) * ![](https://img.shields.io/badge/php-20232A?style=for-the-badge&logo=php)
* ![](https://img.shields.io/badge/SqLite-20232A?style=for-the-badge&logo=mysql) * ![](https://img.shields.io/badge/MySQL-20232A?style=for-the-badge&logo=mysql)
* ![](https://img.shields.io/badge/Bootstrap-20232A?style=for-the-badge&logo=bootstrap) * ![](https://img.shields.io/badge/Bootstrap-20232A?style=for-the-badge&logo=bootstrap)
<p align="right">(<a href="#readme-top">back to top</a>)</p> <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> <p align="right">(<a href="#readme-top">back to top</a>)</p>
## Known issues
- Some stations with RER A doesnt display timetables
## License ## License

View File

@ -70,4 +70,38 @@ $userDetails = getUserDetails($_SESSION['user_id']);
</div> </div>
<button type="submit" class="btn btn-primary">Save Changes</button> <button type="submit" class="btn btn-primary">Save Changes</button>
</form> </form>
</div> </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>

View File

@ -12,8 +12,8 @@ function getStopName($stopId) {
function getFavorites($lineId) { function getFavorites($lineId) {
global $conn; global $conn;
try { try {
$query = $conn->prepare("SELECT stopId FROM favorites WHERE lineId = ?"); $query = $conn->prepare("SELECT stopId FROM favorites WHERE lineId = ? AND userId = ?");
$query->execute([$lineId]); $query->execute([$lineId, $_SESSION['user_id']]);
$result = $query->fetchAll(PDO::FETCH_ASSOC); $result = $query->fetchAll(PDO::FETCH_ASSOC);
return $result; return $result;

View File

@ -13,13 +13,15 @@ $directions = [];
if (isset($data['Siri']['ServiceDelivery']['StopMonitoringDelivery'][0]['MonitoredStopVisit'])) { if (isset($data['Siri']['ServiceDelivery']['StopMonitoringDelivery'][0]['MonitoredStopVisit'])) {
foreach ($data['Siri']['ServiceDelivery']['StopMonitoringDelivery'][0]['MonitoredStopVisit'] as $visit) { foreach ($data['Siri']['ServiceDelivery']['StopMonitoringDelivery'][0]['MonitoredStopVisit'] as $visit) {
$vehicleJourney = $visit['MonitoredVehicleJourney']; $vehicleJourney = $visit['MonitoredVehicleJourney'];
if (isset($vehicleJourney['MonitoredCall']['ExpectedArrivalTime'])) { if (strpos($vehicleJourney['OperatorRef']['value'], '.' . $lineId . '.' . $lineId . ':')) {
$direction = $vehicleJourney['DirectionName'][0]['value']; if (isset($vehicleJourney['MonitoredCall']['ExpectedDepartureTime'])) {
$expectedArrival = $vehicleJourney['MonitoredCall']['ExpectedArrivalTime']; $direction = $vehicleJourney['DestinationName'][0]['value'];
$expectedDeparture = $vehicleJourney['MonitoredCall']['ExpectedDepartureTime']; $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 ($departureTime > $currentTime) {
if (!isset($directions[$direction])) { if (!isset($directions[$direction])) {
$directions[$direction] = []; $directions[$direction] = [];
} }
@ -28,6 +30,8 @@ if (isset($data['Siri']['ServiceDelivery']['StopMonitoringDelivery'][0]['Monitor
} }
} }
} }
}
}
} }
$finalDirections = []; $finalDirections = [];

View File

@ -13,9 +13,10 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$_SESSION['is_admin'] = $user['is_admin']; $_SESSION['is_admin'] = $user['is_admin'];
header("Location: /"); 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(':userId', $user['id']);
$log->bindParam(':date', date('Y-m-d-H-i-s')); $log->bindParam(':date', date('Y-m-d-H-i-s'));
$log->bindParam(':ip', $_SERVER['REMOTE_ADDR']);
$log->execute(); $log->execute();
} else { } else {
$errorMessage = "Invalid email or password."; $errorMessage = "Invalid email or password.";

View File

@ -91,11 +91,11 @@ document.addEventListener('DOMContentLoaded', function() {
if (action === 'add') { if (action === 'add') {
buttonElement.classList.remove('add-stop', 'btn-success'); buttonElement.classList.remove('add-stop', 'btn-success');
buttonElement.classList.add('remove-stop', 'btn-danger'); buttonElement.classList.add('remove-stop', 'btn-danger');
buttonElement.textContent = 'Retirer'; buttonElement.textContent = 'Revoke';
} else { } else {
buttonElement.classList.remove('remove-stop', 'btn-danger'); buttonElement.classList.remove('remove-stop', 'btn-danger');
buttonElement.classList.add('add-stop', 'btn-success'); buttonElement.classList.add('add-stop', 'btn-success');
buttonElement.textContent = 'Ajouter'; buttonElement.textContent = 'Add';
} }
buttonElement.removeEventListener('click', arguments.callee); buttonElement.removeEventListener('click', arguments.callee);
buttonElement.addEventListener('click', arguments.callee); buttonElement.addEventListener('click', arguments.callee);

View File

@ -14,11 +14,13 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
} }
if (!isset($errorMessage)) { if (!isset($errorMessage)) {
try {
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
$query = $conn->prepare("INSERT INTO users (firstName, lastName, email, password) VALUES (:firstName, :lastName, :email, :password)"); $query = $conn->prepare("INSERT INTO users (firstName, lastName, email, password) VALUES (:firstName, :lastName, :email, :password)");
$query->bindParam(':firstName', $_POST['firstName']); $query->bindParam(':firstName', $_POST['firstName']);
$query->bindParam(':lastName', $_POST['lastName']); $query->bindParam(':lastName', $_POST['lastName']);
$query->bindParam(':email', $_POST['email']); $query->bindParam(':email', $_POST['email']);
$query->bindParam(':password', password_hash($_POST['password'], PASSWORD_DEFAULT)); $query->bindParam(':password', $password);
$query->execute(); $query->execute();
$query = $conn->prepare("SELECT COUNT(*) as count FROM users"); $query = $conn->prepare("SELECT COUNT(*) as count FROM users");
@ -33,6 +35,9 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
header("Location: login.php"); header("Location: login.php");
exit(); exit();
} catch (PDOException $e) {
$errorMessage = "Please fill correct values";
}
} }
} }

View File

@ -3,7 +3,8 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <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"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<?php <?php
if (!isset($_SESSION['user_id'])) { 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

View File

@ -11,11 +11,17 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['stopId'], $_POST['lin
try { try {
if ($action === 'add') { if ($action === 'add') {
$stmt = $conn->prepare("INSERT INTO favorites (userId, stopId, lineId) VALUES (?, ?, ?)"); $query = $conn->prepare("SELECT * FROM favorites WHERE userId = ? AND stopId = ? AND lineId = ?");
$stmt->execute([$userId, $stopId, $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') { } elseif ($action === 'remove') {
$stmt = $conn->prepare("DELETE FROM favorites WHERE userId = ? AND stopId = ? AND lineId = ?"); $query = $conn->prepare("DELETE FROM favorites WHERE userId = ? AND stopId = ? AND lineId = ?");
$stmt->execute([$userId, $stopId, $lineId]); $query->execute([$userId, $stopId, $lineId]);
} }
echo json_encode(['success' => true]); echo json_encode(['success' => true]);
} catch (PDOException $e) { } catch (PDOException $e) {

View File

@ -11,7 +11,10 @@ try {
lastName VARCHAR(50) NOT NULL, lastName VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL, 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 ( $conn->exec("CREATE TABLE IF NOT EXISTS favorites (
@ -24,6 +27,7 @@ try {
$conn->exec("CREATE TABLE IF NOT EXISTS logs ( $conn->exec("CREATE TABLE IF NOT EXISTS logs (
userId INT NOT NULL, userId INT NOT NULL,
date DATETIME NOT NULL, date DATETIME NOT NULL,
ip VARCHAR(255) NOT NULL,
FOREIGN KEY (userId) REFERENCES users(id) FOREIGN KEY (userId) REFERENCES users(id)
)"); )");