Skip to content

Commit

Permalink
[Job Launcher] Refactor createJob (#1574)
Browse files Browse the repository at this point in the history
* Refactor creteJob in job.service.ts

* Remove wrong files pushed
  • Loading branch information
flopez7 authored Feb 13, 2024
1 parent fbe0513 commit ce1b8e6
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 49 deletions.
2 changes: 2 additions & 0 deletions packages/apps/job-launcher/server/src/modules/job/job.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -746,3 +746,5 @@ class TaskData {
@IsOptional()
datapoint_text?: DatapointText;
}

export type CreateJob = JobFortuneDto | JobCvatDto | JobCaptchaDto;
11 changes: 11 additions & 0 deletions packages/apps/job-launcher/server/src/modules/job/job.interface.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { JobRequestType } from '../../common/enums/job';
import { CreateJob } from './job.dto';

export interface RequestAction {
calculateFundAmount: (dto: CreateJob, rate: number) => Promise<number>;
createManifest: (
dto: CreateJob,
requestType: JobRequestType,
fundAmount: number,
) => Promise<any>;
}
Original file line number Diff line number Diff line change
Expand Up @@ -500,7 +500,7 @@ describe('JobService', () => {
advanced: {},
};

const result = await jobService.createHCaptchaManifest(jobType, jobDto);
const result = await jobService.createHCaptchaManifest(jobDto);

expect(result).toEqual({
job_mode: JobCaptchaMode.BATCH,
Expand Down Expand Up @@ -555,7 +555,7 @@ describe('JobService', () => {
advanced: {},
};

const result = await jobService.createHCaptchaManifest(jobType, jobDto);
const result = await jobService.createHCaptchaManifest(jobDto);

expect(result).toEqual({
job_mode: JobCaptchaMode.BATCH,
Expand Down Expand Up @@ -629,7 +629,7 @@ describe('JobService', () => {
advanced: {},
};

const result = await jobService.createHCaptchaManifest(jobType, jobDto);
const result = await jobService.createHCaptchaManifest(jobDto);

expect(result).toEqual({
job_mode: JobCaptchaMode.BATCH,
Expand Down Expand Up @@ -703,7 +703,7 @@ describe('JobService', () => {
advanced: {},
};

const result = await jobService.createHCaptchaManifest(jobType, jobDto);
const result = await jobService.createHCaptchaManifest(jobDto);

expect(result).toEqual({
job_mode: JobCaptchaMode.BATCH,
Expand Down Expand Up @@ -775,7 +775,7 @@ describe('JobService', () => {
advanced: {},
};

const result = await jobService.createHCaptchaManifest(jobType, jobDto);
const result = await jobService.createHCaptchaManifest(jobDto);

expect(result).toEqual({
job_mode: JobCaptchaMode.BATCH,
Expand Down Expand Up @@ -839,7 +839,7 @@ describe('JobService', () => {
};

await expect(
jobService.createHCaptchaManifest(jobType, jobDto),
jobService.createHCaptchaManifest(jobDto),
).rejects.toThrowError(BadRequestException);
});
});
Expand Down
99 changes: 56 additions & 43 deletions packages/apps/job-launcher/server/src/modules/job/job.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ import {
JobCaptchaAdvancedDto,
JobCaptchaDto,
RestrictedAudience,
CreateJob,
} from './job.dto';
import { JobEntity } from './job.entity';
import { JobRepository } from './job.repository';
Expand Down Expand Up @@ -101,6 +102,7 @@ import {
import { WebhookDataDto } from '../webhook/webhook.dto';
import * as crypto from 'crypto';
import { PaymentEntity } from '../payment/payment.entity';
import { RequestAction } from './job.interface';

@Injectable()
export class JobService {
Expand Down Expand Up @@ -155,9 +157,9 @@ export class JobService {
}

public async createHCaptchaManifest(
jobType: JobCaptchaShapeType,
jobDto: JobCaptchaDto,
): Promise<HCaptchaManifestDto> {
const jobType = jobDto.annotations.typeOfJob;
const dataUrl = generateBucketUrl(jobDto.data, JobRequestType.HCAPTCHA);
const objectsInBucket = await listObjectsInBucket(
jobDto.data,
Expand Down Expand Up @@ -396,10 +398,54 @@ export class JobService {
return url;
}

private createJobSpecificActions: Record<JobRequestType, RequestAction> = {
[JobRequestType.HCAPTCHA]: {
calculateFundAmount: async (dto: JobCaptchaDto, rate: number) => {
const objectsInBucket = await listObjectsInBucket(
dto.data,
JobRequestType.HCAPTCHA,
);
return await div(
dto.annotations.taskBidPrice * objectsInBucket.length,
rate,
);
},
createManifest: (dto: JobCaptchaDto) => this.createHCaptchaManifest(dto),
},
[JobRequestType.FORTUNE]: {
calculateFundAmount: async (dto: JobCvatDto) => dto.fundAmount,
createManifest: async (
dto: JobFortuneDto,
requestType: JobRequestType,
fundAmount: number,
) => ({
...dto,
requestType,
fundAmount,
}),
},
[JobRequestType.IMAGE_BOXES]: {
calculateFundAmount: async (dto: JobCvatDto) => dto.fundAmount,
createManifest: (
dto: JobCvatDto,
requestType: JobRequestType,
fundAmount: number,
) => this.createCvatManifest(dto, requestType, fundAmount),
},
[JobRequestType.IMAGE_POINTS]: {
calculateFundAmount: async (dto: JobCvatDto) => dto.fundAmount,
createManifest: (
dto: JobCvatDto,
requestType: JobRequestType,
fundAmount: number,
) => this.createCvatManifest(dto, requestType, fundAmount),
},
};

public async createJob(
userId: number,
requestType: JobRequestType,
dto: JobFortuneDto | JobCvatDto | JobCaptchaDto,
dto: CreateJob,
): Promise<number> {
let { chainId } = dto;

Expand All @@ -409,29 +455,11 @@ export class JobService {
chainId = this.routingProtocolService.selectNetwork();
}

let manifestOrigin, fundAmount;
const rate = await getRate(Currency.USD, TokenId.HMT);
const { calculateFundAmount, createManifest } =
this.createJobSpecificActions[requestType];

if (requestType === JobRequestType.HCAPTCHA) {
// hCaptcha
dto = dto as JobCaptchaDto;
const objectsInBucket = await listObjectsInBucket(
dto.data,
JobRequestType.HCAPTCHA,
);
fundAmount = div(
dto.annotations.taskBidPrice * objectsInBucket.length,
rate,
);
} else if (requestType === JobRequestType.FORTUNE) {
// Fortune
dto = dto as JobFortuneDto;
fundAmount = dto.fundAmount;
} else {
// CVAT
dto = dto as JobCvatDto;
fundAmount = dto.fundAmount;
}
const fundAmount = await calculateFundAmount(dto, rate);
const userBalance = await this.paymentService.getUserBalance(userId);
const feePercentage = Number(
await this.getOracleFee(
Expand All @@ -451,26 +479,11 @@ export class JobService {
const tokenFee = mul(fee, rate);
const tokenTotalAmount = add(tokenFundAmount, tokenFee);

if (requestType === JobRequestType.HCAPTCHA) {
// hCaptcha
dto = dto as JobCaptchaDto;
manifestOrigin = await this.createHCaptchaManifest(
dto.annotations.typeOfJob,
dto,
);
} else if (requestType == JobRequestType.FORTUNE) {
// Fortune
dto = dto as JobFortuneDto;
manifestOrigin = { ...dto, requestType, fundAmount: tokenTotalAmount };
} else {
// CVAT
dto = dto as JobCvatDto;
manifestOrigin = await this.createCvatManifest(
dto,
requestType,
tokenFundAmount,
);
}
const manifestOrigin = await createManifest(
dto,
requestType,
tokenFundAmount,
);
const { url, hash } = await this.uploadManifest(
requestType,
chainId,
Expand Down

0 comments on commit ce1b8e6

Please sign in to comment.