feat: Add reprocess command

This commit is contained in:
2026-06-27 23:30:54 +05:00
parent ae32d9067d
commit 7c469a524b
4 changed files with 85 additions and 12 deletions

View File

@@ -211,18 +211,40 @@ func (s *DatasetService) Upload(ctx context.Context, in UploadInput) (domain.Dat
// Kick off the appropriate async job per file type. If enqueueing fails the
// row exists, so record the failure rather than leaving it stuck.
var enqueueErr error
switch in.FileType {
case domain.FileTypeVectorWithKato:
enqueueErr = s.jobs.EnqueueParse(ctx, dataset.ID)
case domain.FileTypeVector:
enqueueErr = s.jobs.EnqueueProperties(ctx, dataset.ID)
case domain.FileTypeRaster:
enqueueErr = s.jobs.EnqueueConvert(ctx, dataset.ID)
if err := s.enqueueProcessing(ctx, dataset); err != nil {
_ = s.repo.MarkParseFailed(ctx, dataset.ID, "failed to enqueue processing: "+err.Error())
return domain.Dataset{}, fmt.Errorf("enqueue processing: %w", err)
}
if enqueueErr != nil {
_ = s.repo.MarkParseFailed(ctx, dataset.ID, "failed to enqueue processing: "+enqueueErr.Error())
return domain.Dataset{}, fmt.Errorf("enqueue processing: %w", enqueueErr)
return dataset, nil
}
// enqueueProcessing schedules the appropriate async job for a dataset based on
// its file type: vector_with_kato is parsed for column selection, plain vector
// has its attribute table extracted into properties, and raster is converted to
// a COG.
func (s *DatasetService) enqueueProcessing(ctx context.Context, d domain.Dataset) error {
switch d.FileType {
case domain.FileTypeVectorWithKato:
return s.jobs.EnqueueParse(ctx, d.ID)
case domain.FileTypeVector:
return s.jobs.EnqueueProperties(ctx, d.ID)
case domain.FileTypeRaster:
return s.jobs.EnqueueConvert(ctx, d.ID)
default:
return fmt.Errorf("%w: unknown file_type %q", domain.ErrValidation, d.FileType)
}
}
// Reprocess re-enqueues the processing job for an existing dataset, restarting
// its asynchronous pipeline from the step appropriate to its file type. Useful
// for retrying after a transient failure or a worker that was behind the schema.
func (s *DatasetService) Reprocess(ctx context.Context, id uuid.UUID) (domain.Dataset, error) {
dataset, err := s.repo.GetByID(ctx, id)
if err != nil {
return domain.Dataset{}, err
}
if err := s.enqueueProcessing(ctx, dataset); err != nil {
return domain.Dataset{}, fmt.Errorf("enqueue processing: %w", err)
}
return dataset, nil
}