refactor: Remove CORS proxy code (not needed for same-domain setup)

- Remove NEXTCLOUD_PROXY constant
- Remove fetchWithProxy() and getProxiedUrl() methods
- Remove useProxy flag from NextcloudStorage
- Keep window.app onclick handlers for dynamically generated buttons
- Clean up code since Nextcloud and TeeTracker run on same domain (wralto.org)

Co-authored-by: trevor1969 <trevor1969@users.noreply.github.com>
This commit is contained in:
Vibe Nuage Agent
2026-06-04 15:56:33 +00:00
parent 7b9f509728
commit df73dce74b

60
app.js
View File

@ -12,9 +12,6 @@ const STORAGE_KEY_NC_CONFIG = 'teatracker_nextcloud_config';
// Nextcloud Storage Integration // Nextcloud Storage Integration
// ============================================ // ============================================
// CORS Proxy for Nextcloud WebDAV (fallback when direct connection fails due to CORS)
const NEXTCLOUD_PROXY = 'https://corsproxy.io/?';
class NextcloudStorage { class NextcloudStorage {
constructor(baseUrl, username, password, path = '/TeeTracker/') { constructor(baseUrl, username, password, path = '/TeeTracker/') {
this.baseUrl = baseUrl.replace(/\/$/, ''); this.baseUrl = baseUrl.replace(/\/$/, '');
@ -24,7 +21,6 @@ class NextcloudStorage {
this.authHeader = 'Basic ' + btoa(`${username}:${password}`); this.authHeader = 'Basic ' + btoa(`${username}:${password}`);
this.connected = false; this.connected = false;
this.lastError = null; this.lastError = null;
this.useProxy = false;
} }
getFileUrl(filename) { getFileUrl(filename) {
@ -34,54 +30,10 @@ class NextcloudStorage {
getDirectoryUrl() { getDirectoryUrl() {
return `${this.baseUrl}/remote.php/dav/files/${encodeURIComponent(this.username)}${this.path}`; return `${this.baseUrl}/remote.php/dav/files/${encodeURIComponent(this.username)}${this.path}`;
} }
// Get proxied URL for CORS fallback
getProxiedUrl(url) {
return `${NEXTCLOUD_PROXY}${encodeURIComponent(url)}`;
}
// Wrapper for fetch that automatically uses proxy on CORS failure
async fetchWithProxy(url, options = {}) {
try {
// First try direct connection
const response = await fetch(url, options);
// If we get a CORS error or network error, it will throw
// If we get here, the request succeeded (even if status is not 2xx)
if (response.ok || response.status === 404 || response.status === 405) {
this.useProxy = false;
return response;
}
// Some errors might still occur, so try proxy
console.log('Direct connection returned non-ok status, trying proxy...');
} catch (error) {
// Direct connection failed (CORS or network error), try proxy
console.log('Direct connection failed, trying proxy...');
}
// Try with proxy
try {
const proxyUrl = this.getProxiedUrl(url);
this.useProxy = true;
const response = await fetch(proxyUrl, options);
if (response.ok || response.status === 404 || response.status === 405) {
console.log('Proxy connection successful');
return response;
}
// If proxy also fails, throw error
throw new Error(`Proxy returned status: ${response.status}`);
} catch (proxyError) {
this.useProxy = false;
console.error('Proxy connection also failed:', proxyError);
throw new Error(`Both direct and proxy connections failed: ${proxyError.message || ''}`);
}
}
async testConnection() { async testConnection() {
try { try {
const response = await this.fetchWithProxy(this.getDirectoryUrl(), { const response = await fetch(this.getDirectoryUrl(), {
method: 'PROPFIND', method: 'PROPFIND',
headers: { headers: {
'Authorization': this.authHeader, 'Authorization': this.authHeader,
@ -113,7 +65,7 @@ class NextcloudStorage {
async ensureDirectory() { async ensureDirectory() {
try { try {
const response = await this.fetchWithProxy(this.getDirectoryUrl(), { const response = await fetch(this.getDirectoryUrl(), {
method: 'MKCOL', method: 'MKCOL',
headers: { 'Authorization': this.authHeader } headers: { 'Authorization': this.authHeader }
}); });
@ -128,7 +80,7 @@ class NextcloudStorage {
async ensureSubDirectory(subPath) { async ensureSubDirectory(subPath) {
try { try {
const subDirUrl = `${this.getDirectoryUrl()}${subPath}/`; const subDirUrl = `${this.getDirectoryUrl()}${subPath}/`;
const response = await this.fetchWithProxy(subDirUrl, { const response = await fetch(subDirUrl, {
method: 'MKCOL', method: 'MKCOL',
headers: { 'Authorization': this.authHeader } headers: { 'Authorization': this.authHeader }
}); });
@ -142,7 +94,7 @@ class NextcloudStorage {
async loadFile(filename) { async loadFile(filename) {
try { try {
const url = this.getFileUrl(filename); const url = this.getFileUrl(filename);
const response = await this.fetchWithProxy(url, { const response = await fetch(url, {
headers: { 'Authorization': this.authHeader } headers: { 'Authorization': this.authHeader }
}); });
@ -162,7 +114,7 @@ class NextcloudStorage {
async saveFile(filename, data) { async saveFile(filename, data) {
try { try {
const url = this.getFileUrl(filename); const url = this.getFileUrl(filename);
const response = await this.fetchWithProxy(url, { const response = await fetch(url, {
method: 'PUT', method: 'PUT',
headers: { headers: {
'Authorization': this.authHeader, 'Authorization': this.authHeader,
@ -180,7 +132,7 @@ class NextcloudStorage {
async fileExists(filename) { async fileExists(filename) {
try { try {
const url = this.getFileUrl(filename); const url = this.getFileUrl(filename);
const response = await this.fetchWithProxy(url, { const response = await fetch(url, {
method: 'HEAD', method: 'HEAD',
headers: { 'Authorization': this.authHeader } headers: { 'Authorization': this.authHeader }
}); });