Skip to content

Commit d0698b4

Browse files
authored
[Job Launcher] Create manifest module (#3306)
* feat: refactor job module to include manifest module and update related imports * Add bsc testnet hmt token address * refactor: remove unused oracle address configurations from environment files * feat: update job creation process to include JobCaptchaDto and refactor manifest creation logic * Refactor Manifest Module and Service - Removed unused configuration services from ManifestModule. - Updated ManifestService to use new job types (CvatJobType, AudinoJobType, FortuneJobType, HCaptchaJobType). - Implemented new methods for CVAT elements count and image consistency checks. - Refactored createManifest method to streamline manifest creation for different job types. - Enhanced unit tests for ManifestService to reflect changes in job types and added mocks for storage service. - Updated routing protocol and webhook service tests to use new job types. - Cleaned up environment configuration files by removing deprecated oracle addresses. * Merge branch 'develop' into feat/job-launcher/manifest-module * feat: enhance DTO validation and update manifest service methods
1 parent 508a14b commit d0698b4

34 files changed

+2445
-1568
lines changed

packages/apps/job-launcher/server/.env.example

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,9 @@ GAS_PRICE_MULTIPLIER=1
2020
PGP_PRIVATE_KEY=
2121
PGP_ENCRYPT=
2222
PGP_PASSPHRASE=
23-
FORTUNE_EXCHANGE_ORACLE_ADDRESS=
24-
FORTUNE_RECORDING_ORACLE_ADDRESS=
25-
CVAT_EXCHANGE_ORACLE_ADDRESS=
26-
CVAT_RECORDING_ORACLE_ADDRESS=
27-
AUDINO_EXCHANGE_ORACLE_ADDRESS=
28-
AUDINO_RECORDING_ORACLE_ADDRESS=
2923
REPUTATION_ORACLE_ADDRESS=
3024
HCAPTCHA_RECORDING_ORACLE_URI=
3125
HCAPTCHA_REPUTATION_ORACLE_URI=
32-
HCAPTCHA_ORACLE_ADDRESS=
3326
HCAPTCHA_SITE_KEY=
3427
RPC_URL_SEPOLIA=
3528
RPC_URL_POLYGON=

packages/apps/job-launcher/server/ENV.md

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -180,24 +180,9 @@ REPUTATION_ORACLE_ADDRESS=
180180
### List of reputation oracle addresses, typically comma-separated. Required
181181
REPUTATION_ORACLES=
182182

183-
### Address of the Fortune exchange oracle contract. Required
184-
FORTUNE_EXCHANGE_ORACLE_ADDRESS=
185-
186-
### Address of the Fortune recording oracle contract. Required
187-
FORTUNE_RECORDING_ORACLE_ADDRESS=
188-
189-
### Address of the CVAT exchange oracle contract. Required
190-
CVAT_EXCHANGE_ORACLE_ADDRESS=
191-
192-
### Address of the CVAT recording oracle contract. Required
193-
CVAT_RECORDING_ORACLE_ADDRESS=
194-
195183
### URI for the hCaptcha recording oracle service. Required
196184
HCAPTCHA_RECORDING_ORACLE_URI=
197185

198186
### URI for the hCaptcha reputation oracle service. Required
199187
HCAPTCHA_REPUTATION_ORACLE_URI=
200188

201-
### Address of the hCaptcha oracle contract. Required
202-
HCAPTCHA_ORACLE_ADDRESS=
203-

packages/apps/job-launcher/server/jest.config.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1+
import { createDefaultPreset } from 'ts-jest';
2+
3+
const jestTsPreset = createDefaultPreset({});
4+
15
module.exports = {
6+
...jestTsPreset,
27
coverageDirectory: '../coverage',
38
collectCoverageFrom: ['**/*.(t|j)s'],
49
moduleFileExtensions: ['js', 'json', 'ts'],
510
rootDir: 'src',
611
testEnvironment: 'node',
712
testRegex: '.*\\.spec\\.ts$',
8-
transform: {
9-
'^.+\\.(t|j)s$': 'ts-jest',
10-
},
1113
moduleNameMapper: {
1214
'^uuid$': require.resolve('uuid'),
1315
'^typeorm$': require.resolve('typeorm'),

packages/apps/job-launcher/server/src/common/config/env-schema.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,8 @@ export const envValidator = Joi.object({
3030
GAS_PRICE_MULTIPLIER: Joi.number(),
3131
REPUTATION_ORACLE_ADDRESS: Joi.string().required(),
3232
REPUTATION_ORACLES: Joi.string().required(),
33-
FORTUNE_EXCHANGE_ORACLE_ADDRESS: Joi.string().required(),
34-
FORTUNE_RECORDING_ORACLE_ADDRESS: Joi.string().required(),
35-
CVAT_EXCHANGE_ORACLE_ADDRESS: Joi.string().required(),
36-
CVAT_RECORDING_ORACLE_ADDRESS: Joi.string().required(),
37-
AUDINO_EXCHANGE_ORACLE_ADDRESS: Joi.string(),
38-
AUDINO_RECORDING_ORACLE_ADDRESS: Joi.string(),
3933
HCAPTCHA_RECORDING_ORACLE_URI: Joi.string().required(),
4034
HCAPTCHA_REPUTATION_ORACLE_URI: Joi.string().required(),
41-
HCAPTCHA_ORACLE_ADDRESS: Joi.string().required(),
4235
HCAPTCHA_SITE_KEY: Joi.string().required(),
4336
HCAPTCHA_SECRET: Joi.string().required(),
4437
HCAPTCHA_PROTECTION_URL: Joi.string().description(

packages/apps/job-launcher/server/src/common/config/web3-config.service.ts

Lines changed: 0 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -45,46 +45,6 @@ export class Web3ConfigService {
4545
return this.configService.getOrThrow<string>('REPUTATION_ORACLES');
4646
}
4747

48-
/**
49-
* Address of the Fortune exchange oracle contract.
50-
* Required
51-
*/
52-
get fortuneExchangeOracleAddress(): string {
53-
return this.configService.getOrThrow<string>(
54-
'FORTUNE_EXCHANGE_ORACLE_ADDRESS',
55-
);
56-
}
57-
58-
/**
59-
* Address of the Fortune recording oracle contract.
60-
* Required
61-
*/
62-
get fortuneRecordingOracleAddress(): string {
63-
return this.configService.getOrThrow<string>(
64-
'FORTUNE_RECORDING_ORACLE_ADDRESS',
65-
);
66-
}
67-
68-
/**
69-
* Address of the CVAT exchange oracle contract.
70-
* Required
71-
*/
72-
get cvatExchangeOracleAddress(): string {
73-
return this.configService.getOrThrow<string>(
74-
'CVAT_EXCHANGE_ORACLE_ADDRESS',
75-
);
76-
}
77-
78-
/**
79-
* Address of the CVAT recording oracle contract.
80-
* Required
81-
*/
82-
get cvatRecordingOracleAddress(): string {
83-
return this.configService.getOrThrow<string>(
84-
'CVAT_RECORDING_ORACLE_ADDRESS',
85-
);
86-
}
87-
8848
/**
8949
* URI for the hCaptcha recording oracle service.
9050
* Required
@@ -104,30 +64,4 @@ export class Web3ConfigService {
10464
'HCAPTCHA_REPUTATION_ORACLE_URI',
10565
);
10666
}
107-
108-
/**
109-
* Address of the hCaptcha oracle contract.
110-
* Required
111-
*/
112-
get hCaptchaOracleAddress(): string {
113-
return this.configService.getOrThrow<string>('HCAPTCHA_ORACLE_ADDRESS');
114-
}
115-
116-
/**
117-
* Address of the Audino exchange oracle.
118-
*/
119-
get audinoExchangeOracleAddress(): string {
120-
return this.configService.getOrThrow<string>(
121-
'AUDINO_EXCHANGE_ORACLE_ADDRESS',
122-
);
123-
}
124-
125-
/**
126-
* Address of the Audino recording oracle.
127-
*/
128-
get audinoRecordingOracleAddress(): string {
129-
return this.configService.getOrThrow<string>(
130-
'AUDINO_RECORDING_ORACLE_ADDRESS',
131-
);
132-
}
13367
}

packages/apps/job-launcher/server/src/common/constants/index.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { ChainId } from '@human-protocol/sdk';
2-
import { JobRequestType, JobStatus } from '../enums/job';
2+
import { CvatJobType, JobStatus } from '../enums/job';
33

44
export const SERVICE_NAME = 'Job Launcher';
55
export const NS = 'hmt';
@@ -26,11 +26,11 @@ export const SENDGRID_API_KEY_DISABLED = 'sendgrid-disabled';
2626
export const HEADER_SIGNATURE_KEY = 'human-signature';
2727

2828
export const CVAT_JOB_TYPES = [
29-
JobRequestType.IMAGE_POLYGONS,
30-
JobRequestType.IMAGE_BOXES,
31-
JobRequestType.IMAGE_POINTS,
32-
JobRequestType.IMAGE_BOXES_FROM_POINTS,
33-
JobRequestType.IMAGE_SKELETONS_FROM_BOXES,
29+
CvatJobType.IMAGE_POLYGONS,
30+
CvatJobType.IMAGE_BOXES,
31+
CvatJobType.IMAGE_POINTS,
32+
CvatJobType.IMAGE_BOXES_FROM_POINTS,
33+
CvatJobType.IMAGE_SKELETONS_FROM_BOXES,
3434
];
3535

3636
export const CANCEL_JOB_STATUSES = [

packages/apps/job-launcher/server/src/common/constants/tokens.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,10 @@ export const TOKEN_ADDRESSES: {
5959
// decimals: 6,
6060
// },
6161
},
62+
[ChainId.BSC_TESTNET]: {
63+
[EscrowFundToken.HMT]: {
64+
address: NETWORKS[ChainId.BSC_TESTNET]!.hmtAddress,
65+
decimals: 18,
66+
},
67+
},
6268
};

packages/apps/job-launcher/server/src/common/enums/job.ts

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,39 @@ export enum JobSortField {
2727
CREATED_AT = 'created_at',
2828
}
2929

30-
export enum JobRequestType {
30+
export enum FortuneJobType {
31+
FORTUNE = 'fortune',
32+
}
33+
34+
export enum HCaptchaJobType {
35+
HCAPTCHA = 'hcaptcha',
36+
}
37+
38+
export enum CvatJobType {
3139
IMAGE_POINTS = 'image_points',
3240
IMAGE_POLYGONS = 'image_polygons',
3341
IMAGE_BOXES = 'image_boxes',
3442
IMAGE_BOXES_FROM_POINTS = 'image_boxes_from_points',
3543
IMAGE_SKELETONS_FROM_BOXES = 'image_skeletons_from_boxes',
36-
HCAPTCHA = 'hcaptcha',
37-
FORTUNE = 'fortune',
44+
}
45+
46+
export enum AudinoJobType {
3847
AUDIO_TRANSCRIPTION = 'audio_transcription',
3948
}
4049

50+
export const JobType = [
51+
...Object.values(CvatJobType),
52+
...Object.values(FortuneJobType),
53+
...Object.values(HCaptchaJobType),
54+
...Object.values(AudinoJobType),
55+
];
56+
57+
export type JobRequestType =
58+
| CvatJobType
59+
| FortuneJobType
60+
| AudinoJobType
61+
| HCaptchaJobType;
62+
4163
export enum JobCaptchaMode {
4264
BATCH = 'batch',
4365
}

packages/apps/job-launcher/server/src/common/utils/slack.spec.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import axios from 'axios';
22
import { sendSlackNotification } from './slack';
33

4-
export const MOCK_SLACK_ABUSE_NOTIFICATION_WEBHOOK_URL =
5-
'https://slack.com/webhook';
4+
const MOCK_SLACK_ABUSE_NOTIFICATION_WEBHOOK_URL = 'https://slack.com/webhook';
65

76
jest.mock('axios');
87
describe('sendSlackNotification', () => {

packages/apps/job-launcher/server/src/common/utils/storage.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { AWSRegions, StorageProviders } from '../enums/storage';
2-
import { JobRequestType } from '../enums/job';
2+
import { CvatJobType } from '../enums/job';
33
import axios from 'axios';
44
import { StorageDataDto } from '../../modules/job/job.dto';
55
import { generateBucketUrl, listObjectsInBucket } from './storage';
@@ -15,7 +15,7 @@ describe('Storage utils', () => {
1515
bucketName: 'my-bucket',
1616
path: 'my-folder',
1717
};
18-
const url = generateBucketUrl(storageData, JobRequestType.IMAGE_POINTS);
18+
const url = generateBucketUrl(storageData, CvatJobType.IMAGE_POINTS);
1919
const objects = ['object1', 'object2'];
2020
const response = {
2121
status: 200,
@@ -44,7 +44,7 @@ describe('Storage utils', () => {
4444
bucketName: 'my-bucket',
4545
path: 'my-folder',
4646
};
47-
const url = generateBucketUrl(storageData, JobRequestType.IMAGE_POINTS);
47+
const url = generateBucketUrl(storageData, CvatJobType.IMAGE_POINTS);
4848
const objects = Array.from({ length: 4 }, (_, i) => `object${i + 1}`);
4949
const response1 = {
5050
status: 200,
@@ -90,7 +90,7 @@ describe('Storage utils', () => {
9090
bucketName: 'my-bucket',
9191
path: 'my-folder',
9292
};
93-
const url = generateBucketUrl(storageData, JobRequestType.IMAGE_POINTS);
93+
const url = generateBucketUrl(storageData, CvatJobType.IMAGE_POINTS);
9494
const response = {
9595
status: 200,
9696
data: `
@@ -112,7 +112,7 @@ describe('Storage utils', () => {
112112
bucketName: 'non-existent-bucket',
113113
path: 'my-folder',
114114
};
115-
const url = generateBucketUrl(storageData, JobRequestType.IMAGE_POINTS);
115+
const url = generateBucketUrl(storageData, CvatJobType.IMAGE_POINTS);
116116
const response = {
117117
status: 404,
118118
data: 'Bucket not found',
@@ -131,7 +131,7 @@ describe('Storage utils', () => {
131131
bucketName: 'private-bucket',
132132
path: 'my-folder',
133133
};
134-
const url = generateBucketUrl(storageData, JobRequestType.IMAGE_POINTS);
134+
const url = generateBucketUrl(storageData, CvatJobType.IMAGE_POINTS);
135135
const response = {
136136
status: 403,
137137
data: 'Access denied',

0 commit comments

Comments
 (0)