Initial commit

This commit is contained in:
Juan José Gutiérrez de Quevedo Pérez 2025-11-20 20:38:29 +01:00
commit f2817bc1f1
17 changed files with 2785 additions and 0 deletions

112
ui/api.js Normal file
View file

@ -0,0 +1,112 @@
/**
* CVS Proxy API Client
* Handles all API calls to the backend
*/
class CVSProxyAPI {
constructor(baseURL = '') {
this.baseURL = baseURL || '';
}
/**
* Make a fetch request to the API
* @param {string} endpoint - API endpoint
* @param {object} options - Fetch options
* @returns {Promise} Response data
*/
async request(endpoint, options = {}) {
const url = `${this.baseURL}/v1${endpoint}`;
try {
const response = await fetch(url, {
headers: {
'Content-Type': 'application/json',
...options.headers,
},
...options,
});
if (!response.ok) {
const error = await response.json().catch(() => ({}));
throw new Error(error.error || `HTTP ${response.status}`);
}
// Handle different content types
const contentType = response.headers.get('content-type');
if (contentType && contentType.includes('application/json')) {
return await response.json();
} else {
return await response.text();
}
} catch (error) {
console.error('API Error:', error);
throw error;
}
}
/**
* Get repository tree structure
* @param {string} module - Optional module to list
* @returns {Promise<Array>} List of files and directories
*/
async getTree(module = null) {
const params = new URLSearchParams();
if (module) {
params.append('module', module);
}
const query = params.toString() ? `?${params.toString()}` : '';
return this.request(`/tree${query}`);
}
/**
* Get file content
* @param {string} filePath - Path to the file
* @param {string} revision - Optional specific revision
* @returns {Promise<string>} File content
*/
async getFileContent(filePath, revision = null) {
const params = new URLSearchParams();
params.append('file', filePath);
if (revision) {
params.append('revision', revision);
}
return this.request(`/file?${params.toString()}`);
}
/**
* Get file revision history
* @param {string} filePath - Path to the file
* @returns {Promise<Array>} Array of revision objects
*/
async getFileHistory(filePath) {
const params = new URLSearchParams();
params.append('file', filePath);
return this.request(`/history?${params.toString()}`);
}
/**
* Get diff between two revisions
* @param {string} filePath - Path to the file
* @param {string} rev1 - First revision
* @param {string} rev2 - Second revision
* @returns {Promise<object>} Diff object with diff property
*/
async getDiff(filePath, rev1, rev2) {
const params = new URLSearchParams();
params.append('file', filePath);
params.append('rev1', rev1);
params.append('rev2', rev2);
return this.request(`/diff?${params.toString()}`);
}
/**
* Check API health
* @returns {Promise<object>} Health status
*/
async getHealth() {
return this.request('/health');
}
}
// Create global API instance
const api = new CVSProxyAPI();