wsj-filenaming/sheet_helpers.php
Vadym Samoilenko 523be058aa Add Azure AD / MSAL SSO authentication
- config.php: Azure tenant/client constants, SSO_ENABLED = true
- auth.php: requireAuth() middleware, getSafeUser(), getUserDataFile()
- auth_gate.php: MSAL.js PKCE login flow, stores return URL in sessionStorage
- logout.php: destroys PHP session + calls msalInstance.logoutRedirect()
- api.php: public create_session endpoint (JWT validation), 401 guard on all other actions, per-user data files (data_{safeUser}.json)
- sheet_helpers.php: fix dot sanitisation '_' → '_dot_' to match getSafeUser()
- index/builder/help.php: requireAuth() at top, user email + Sign Out in header

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-02 21:43:32 +00:00

147 lines
3.9 KiB
PHP

<?php
// Sheet Management Helper Functions
function getMetadataPath() {
return __DIR__ . '/sheets_metadata.json';
}
function getSheetPath($user, $sheetId) {
$safeUser = str_replace(['@', '.'], ['_at_', '_dot_'], $user);
return __DIR__ . "/sheets/{$safeUser}_{$sheetId}.json";
}
function loadMetadata() {
$path = getMetadataPath();
if (!file_exists($path)) {
return [];
}
$content = file_get_contents($path);
return json_decode($content, true) ?: [];
}
function saveMetadata($metadata) {
$path = getMetadataPath();
file_put_contents($path, json_encode($metadata, JSON_PRETTY_PRINT));
chmod($path, 0666); // Ensure writable
}
function getUserSheets($user) {
$metadata = loadMetadata();
return $metadata[$user] ?? [];
}
function createSheet($user, $name, $data = []) {
$sheetId = time() . rand(100, 999);
$now = date('c');
$sheet = [
'id' => $sheetId,
'name' => $name ?: "Untitled Sheet - " . date('Y-m-d H:i'),
'created' => $now,
'modified' => $now,
'itemCount' => count($data),
'user' => $user
];
// Save sheet data
$sheetPath = getSheetPath($user, $sheetId);
file_put_contents($sheetPath, json_encode($data, JSON_PRETTY_PRINT));
chmod($sheetPath, 0666); // Ensure writable
// Update metadata
$metadata = loadMetadata();
if (!isset($metadata[$user])) {
$metadata[$user] = [];
}
$metadata[$user][] = $sheet;
saveMetadata($metadata);
return $sheet;
}
function loadSheetData($user, $sheetId) {
$sheetPath = getSheetPath($user, $sheetId);
if (!file_exists($sheetPath)) {
return null;
}
$content = file_get_contents($sheetPath);
return json_decode($content, true);
}
function updateSheet($user, $sheetId, $data) {
// Update sheet data
$sheetPath = getSheetPath($user, $sheetId);
file_put_contents($sheetPath, json_encode($data, JSON_PRETTY_PRINT));
chmod($sheetPath, 0666); // Ensure writable
// Update metadata
$metadata = loadMetadata();
if (isset($metadata[$user])) {
foreach ($metadata[$user] as &$sheet) {
if ($sheet['id'] == $sheetId) {
$sheet['modified'] = date('c');
$sheet['itemCount'] = count($data);
break;
}
}
saveMetadata($metadata);
}
}
function deleteSheet($user, $sheetId) {
// Delete sheet file
$sheetPath = getSheetPath($user, $sheetId);
if (file_exists($sheetPath)) {
unlink($sheetPath);
}
// Update metadata
$metadata = loadMetadata();
if (isset($metadata[$user])) {
$metadata[$user] = array_filter($metadata[$user], function($sheet) use ($sheetId) {
return $sheet['id'] != $sheetId;
});
$metadata[$user] = array_values($metadata[$user]); // Re-index
saveMetadata($metadata);
}
}
function renameSheet($user, $sheetId, $newName) {
$metadata = loadMetadata();
if (isset($metadata[$user])) {
foreach ($metadata[$user] as &$sheet) {
if ($sheet['id'] == $sheetId) {
$sheet['name'] = $newName;
$sheet['modified'] = date('c');
break;
}
}
saveMetadata($metadata);
return true;
}
return false;
}
function duplicateSheet($user, $sheetId) {
// Load original sheet
$originalData = loadSheetData($user, $sheetId);
if (!$originalData) {
return null;
}
// Get original name
$metadata = loadMetadata();
$originalName = "Copy of Sheet";
if (isset($metadata[$user])) {
foreach ($metadata[$user] as $sheet) {
if ($sheet['id'] == $sheetId) {
$originalName = "Copy of " . $sheet['name'];
break;
}
}
}
// Create new sheet
return createSheet($user, $originalName, $originalData);
}
?>