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:
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user