feat(14-07): add analysis API helpers and store state/actions (Task 1)

- Add estimateAnalysis, enqueueAnalysis, getAnalysisJobStatus, listAnalysisJobs,
  cancelAnalysisJob, cancelAnalysisItem, skipAnalysisItem, retryAnalysisItem,
  getCacheSettings, updateCacheSettings to api/cloud.js
- Extend cloudConnections store with analysis state: activeAnalysisJob, analysisQueue
  (computed), failureBehavior, detailedAnalysisProgress, cacheLimit
- Add store actions: requestEstimate, enqueueAnalysis, fetchJobStatus, cancelJob,
  retryItem, skipItem, cancelItem, setFailureBehavior, setDetailedAnalysisProgress,
  updateCacheSettings
- Add translateAnalysisStatus (D-06: single translation source for components)
- Status labels: simplified (waiting/working/done/skipped/failed) and detailed modes
- Credentials never stored in queue state (T-14-02)
This commit is contained in:
curo1305
2026-06-23 19:35:33 +02:00
parent a2b7928ba4
commit 1291040f9b
2 changed files with 372 additions and 0 deletions
+115
View File
@@ -255,3 +255,118 @@ export function downloadCloudFile(connectionId, itemId) {
{ method: 'GET' },
)
}
// ── Phase 14: Analysis API ────────────────────────────────────────────────────
/**
* Estimate the scope of an analysis job for a cloud connection.
*
* T-14-04: No provider bytes are downloaded during estimate — metadata only.
* Returns AnalysisEstimateOut: {supported_count, unsupported_count, total_provider_bytes,
* recursive, is_partial, scope_kind}
*
* @param {string} connectionId - Connection UUID
* @param {{ scope: string, provider_item_ids?: string[], recursive?: boolean }} params
*/
export function estimateAnalysis(connectionId, params) {
return jsonRequest(`/api/cloud/analysis/connections/${connectionId}/estimate`, 'POST', params)
}
/**
* Enqueue an analysis job for a cloud connection scope.
*
* Returns AnalysisEnqueueOut: {job_id, status, total_count, queued_count,
* already_current_count, unsupported_count}
*
* @param {string} connectionId - Connection UUID
* @param {{ scope: string, provider_item_ids?: string[], recursive?: boolean,
* failure_behavior?: string }} params
*/
export function enqueueAnalysis(connectionId, params) {
return jsonRequest(`/api/cloud/analysis/connections/${connectionId}/jobs`, 'POST', params)
}
/**
* Get the status of an analysis job.
*
* T-14-02: Response never includes credentials or object_key.
*
* @param {string} jobId - Job UUID
* @param {{ detail?: boolean }} [opts]
*/
export function getAnalysisJobStatus(jobId, opts = {}) {
const qs = opts.detail ? '?detail=true' : ''
return request(`/api/cloud/analysis/jobs/${jobId}${qs}`)
}
/**
* List analysis jobs, optionally filtered by connection or status.
*
* @param {{ connection_id?: string, status?: string }} [filters]
*/
export function listAnalysisJobs(filters = {}) {
const params = new URLSearchParams()
if (filters.connection_id) params.set('connection_id', filters.connection_id)
if (filters.status) params.set('status', filters.status)
const qs = params.toString() ? `?${params}` : ''
return request(`/api/cloud/analysis/jobs${qs}`)
}
/**
* Cancel an entire analysis job batch.
*
* Returns AnalysisControlOut: {kind, reason, status}
*
* @param {string} jobId - Job UUID
*/
export function cancelAnalysisJob(jobId) {
return jsonRequest(`/api/cloud/analysis/jobs/${jobId}/cancel`, 'POST', {})
}
/**
* Cancel a single analysis job item.
*
* @param {string} jobId - Job UUID
* @param {string} itemId - Item UUID
*/
export function cancelAnalysisItem(jobId, itemId) {
return jsonRequest(`/api/cloud/analysis/jobs/${jobId}/items/${itemId}/cancel`, 'POST', {})
}
/**
* Skip a queued or failed analysis job item.
*
* @param {string} jobId - Job UUID
* @param {string} itemId - Item UUID
*/
export function skipAnalysisItem(jobId, itemId) {
return jsonRequest(`/api/cloud/analysis/jobs/${jobId}/items/${itemId}/skip`, 'POST', {})
}
/**
* Retry a failed analysis job item.
*
* @param {string} jobId - Job UUID
* @param {string} itemId - Item UUID
*/
export function retryAnalysisItem(jobId, itemId) {
return jsonRequest(`/api/cloud/analysis/jobs/${jobId}/items/${itemId}/retry`, 'POST', {})
}
/**
* Get the current user cache settings.
*
* Returns { cloud_cache_limit_bytes, ... }
*/
export function getCacheSettings() {
return request('/api/users/me/settings')
}
/**
* Update the current user cache settings.
*
* @param {{ cloud_cache_limit_bytes?: number }} params
*/
export function updateCacheSettings(params) {
return jsonRequest('/api/users/me/settings', 'PATCH', params)
}