import { S3Client } from '@aws-sdk/client-s3'; import { inject } from 'inversify'; import { S3RepositoryBase } from './S3RepositoryBase'; import { provideTransient } from '../transientProvider'; import { JobContext } from '../model/JobContext'; import { JobManifest } from '../manifest'; import { JobExecution } from '../model/JobExecution'; import { InjectTokens } from '../constants/InjectTokens'; @provideTransient(JobDetailsRepository) export class JobDetailsRepository extends S3RepositoryBase { constructor( @inject(S3Client) protected s3Client: S3Client, @inject(InjectTokens.JobDetailsBucket) bucketName: string, ) { super(s3Client, bucketName); } /** * Create the job details file in S3. * Context is nullable as the user could delete the context between queuing the job and creating the details file. * We want the file to be created so the job starts/executes rather than remaining in a queued state/causing * an error. */ public async createJobDetailsFile( tenant: string, jobContext: JobContext | null, jobManifest: JobManifest | null, jobExecution: JobExecution, ): Promise { const key = `${tenant}/${jobExecution.id}`; await this.put(key, JSON.stringify({ jobContext, jobManifest, jobExecution })); return key; } }