feat: Add reprocess command
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user