Skip to content

Commit ab36747

Browse files
authored
[Human App] feat: ui-configuration endpoint (#2841)
* feat: add ui configuration module * refactor: get rid of chain ids in oracles response
1 parent 6868a0d commit ab36747

File tree

14 files changed

+122
-81
lines changed

14 files changed

+122
-81
lines changed

packages/apps/human-app/frontend/src/api/services/worker/oracles.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@ const OracleSchema = z.object({
1616
registrationInstructions: z.string().optional().nullable(),
1717
});
1818

19-
const OraclesDiscoverSuccessSchema = z.object({
20-
oracles: z.array(OracleSchema),
21-
chainIdsEnabled: z.array(z.string()),
22-
});
19+
const OraclesDiscoverySuccessSchema = z.array(OracleSchema);
2320

2421
export type Oracle = z.infer<typeof OracleSchema> & {
2522
name: string;
@@ -62,17 +59,17 @@ export async function getOracles({
6259
? `?${stringifyUrlQueryObject({ selected_job_types })}`
6360
: '';
6461

65-
const result = await apiClient(
62+
const results = await apiClient(
6663
`${apiPaths.worker.oracles.path}${queryParams}`,
6764
{
68-
successSchema: OraclesDiscoverSuccessSchema,
65+
successSchema: OraclesDiscoverySuccessSchema,
6966
options: { method: 'GET' },
7067
},
7168
signal
7269
);
7370

7471
oracles = oracles.concat(
75-
result.oracles.map((oracle) => ({
72+
results.map((oracle) => ({
7673
...oracle,
7774
name: oracleUrlToNameMap.get(oracle.url) ?? '',
7875
}))

packages/apps/human-app/server/src/app.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import { CronJobModule } from './modules/cron-job/cron-job.module';
4242
import { EnvironmentConfigService } from './common/config/environment-config.service';
4343
import { ForbidUnauthorizedHostMiddleware } from './common/middleware/host-check.middleware';
4444
import { HealthModule } from './modules/health/health.module';
45+
import { UiConfigurationModule } from './modules/ui-configuration/ui-configuration.module';
4546

4647
const JOI_BOOLEAN_STRING_SCHEMA = Joi.string().valid('true', 'false');
4748

@@ -122,6 +123,7 @@ const JOI_BOOLEAN_STRING_SCHEMA = Joi.string().valid('true', 'false');
122123
TokenRefreshModule,
123124
CronJobModule,
124125
HealthModule,
126+
UiConfigurationModule,
125127
],
126128
controllers: [
127129
AppController,

packages/apps/human-app/server/src/modules/cron-job/cron-job.service.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { JOB_DISCOVERY_CACHE_KEY } from '../../common/constants/cache';
1313
import { OracleDiscoveryService } from '../oracle-discovery/oracle-discovery.service';
1414
import {
1515
OracleDiscoveryCommand,
16-
OracleDiscoveryResponse,
16+
OracleDiscoveryResult,
1717
} from '../oracle-discovery/model/oracle-discovery.model';
1818
import { WorkerService } from '../user-worker/worker.service';
1919
import { JobDiscoveryFieldName } from '../../common/enums/global-common';
@@ -48,11 +48,9 @@ export class CronJobService {
4848
this.logger.log('CRON START');
4949

5050
const oracleDiscoveryCommand: OracleDiscoveryCommand = {};
51-
const oracles = (
52-
await this.oracleDiscoveryService.processOracleDiscovery(
53-
oracleDiscoveryCommand,
54-
)
55-
).oracles;
51+
const oracles = await this.oracleDiscoveryService.processOracleDiscovery(
52+
oracleDiscoveryCommand,
53+
);
5654

5755
if (!oracles || oracles.length < 1) return;
5856

@@ -86,7 +84,7 @@ export class CronJobService {
8684
this.logger.log('CRON END');
8785
}
8886

89-
async updateJobsListCache(oracle: OracleDiscoveryResponse, token: string) {
87+
async updateJobsListCache(oracle: OracleDiscoveryResult, token: string) {
9088
try {
9189
let allResults: JobsDiscoveryResponseItem[] = [];
9290

@@ -138,13 +136,13 @@ export class CronJobService {
138136
}
139137

140138
private async updateOracleInCache(
141-
oracleData: OracleDiscoveryResponse,
142-
updates: Partial<OracleDiscoveryResponse>,
139+
oracleData: OracleDiscoveryResult,
140+
updates: Partial<OracleDiscoveryResult>,
143141
) {
144142
const updatedOracle = { ...oracleData, ...updates };
145143
const chainId = oracleData.chainId;
146144
const cachedOracles =
147-
await this.cacheManager.get<OracleDiscoveryResponse[]>(chainId);
145+
await this.cacheManager.get<OracleDiscoveryResult[]>(chainId);
148146

149147
if (cachedOracles) {
150148
const updatedOracles = cachedOracles.map((oracle) =>
@@ -158,7 +156,7 @@ export class CronJobService {
158156
}
159157
}
160158

161-
private async handleJobListError(oracleData: OracleDiscoveryResponse) {
159+
private async handleJobListError(oracleData: OracleDiscoveryResult) {
162160
const retriesCount = oracleData.retriesCount || 0;
163161
const newExecutionsToSkip = Math.min(
164162
(oracleData.executionsToSkip || 0) + Math.pow(2, retriesCount),

packages/apps/human-app/server/src/modules/cron-job/spec/cron-job.service.spec.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
} from '../../../modules/jobs-discovery/model/jobs-discovery.model';
1212
import { JOB_DISCOVERY_CACHE_KEY } from '../../../common/constants/cache';
1313
import { JobStatus } from '../../../common/enums/global-common';
14-
import { OracleDiscoveryResponse } from '../../../modules/oracle-discovery/model/oracle-discovery.model';
14+
import { OracleDiscoveryResult } from '../../../modules/oracle-discovery/model/oracle-discovery.model';
1515
import { SchedulerRegistry } from '@nestjs/schedule';
1616
import { generateOracleDiscoveryResponseBody } from '../../../modules/oracle-discovery/spec/oracle-discovery.fixture';
1717

@@ -157,15 +157,15 @@ describe('CronJobService', () => {
157157
password: configServiceMock.password,
158158
});
159159
expect(updateJobsListCacheSpy).toHaveBeenCalledWith(
160-
oraclesDiscovery.oracles[0],
160+
oraclesDiscovery[0],
161161
'Bearer token',
162162
);
163163
});
164164
});
165165

166166
describe('updateJobsListCache', () => {
167167
it('should fetch all jobs and update the cache', async () => {
168-
const oracle: OracleDiscoveryResponse = {
168+
const oracle: OracleDiscoveryResult = {
169169
address: 'mockAddress1',
170170
role: 'validator',
171171
chainId: '137',
@@ -193,7 +193,7 @@ describe('CronJobService', () => {
193193
});
194194

195195
it('should handle errors and call handleJobListError', async () => {
196-
const oracle: OracleDiscoveryResponse = {
196+
const oracle: OracleDiscoveryResult = {
197197
address: 'mockAddress1',
198198
role: 'validator',
199199
chainId: '137',
@@ -219,7 +219,7 @@ describe('CronJobService', () => {
219219
});
220220

221221
it('should reset retries count after successful job fetch', async () => {
222-
const oracle: OracleDiscoveryResponse = {
222+
const oracle: OracleDiscoveryResult = {
223223
address: 'mockAddress1',
224224
role: 'validator',
225225
chainId: '137',
@@ -319,7 +319,7 @@ describe('CronJobService', () => {
319319

320320
describe('updateOracleInCache', () => {
321321
it('should update oracle in cache', async () => {
322-
const oracleData: OracleDiscoveryResponse = {
322+
const oracleData: OracleDiscoveryResult = {
323323
address: 'mockAddress1',
324324
role: 'validator',
325325
chainId: '137',
@@ -344,7 +344,7 @@ describe('CronJobService', () => {
344344

345345
describe('handleJobListError', () => {
346346
it('should increment retries count and executions to skip but not exceed the limit', async () => {
347-
const oracleData: OracleDiscoveryResponse = {
347+
const oracleData: OracleDiscoveryResult = {
348348
address: 'mockAddress1',
349349
role: 'validator',
350350
chainId: '137',
@@ -364,7 +364,7 @@ describe('CronJobService', () => {
364364
});
365365

366366
it('should increment retries count and executions to skip', async () => {
367-
const oracleData: OracleDiscoveryResponse = {
367+
const oracleData: OracleDiscoveryResult = {
368368
address: 'mockAddress1',
369369
role: 'validator',
370370
chainId: '137',

packages/apps/human-app/server/src/modules/oracle-discovery/model/oracle-discovery.model.ts

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
44
import { IsArray, IsOptional } from 'class-validator';
55
import { Exclude, Transform } from 'class-transformer';
66

7-
export class OracleDiscoveryResponse implements IOperator {
7+
export class OracleDiscoveryResult implements IOperator {
88
@ApiProperty({ description: 'Address of the oracle operator' })
99
address: string;
1010

@@ -55,19 +55,6 @@ export class OracleDiscoveryResponse implements IOperator {
5555
this.registrationInstructions = registrationInstructions;
5656
}
5757
}
58-
59-
export class OracleDiscoveryResponseDto {
60-
@ApiProperty({
61-
type: [OracleDiscoveryResponse],
62-
description: 'List of discovered oracles',
63-
})
64-
oracles: OracleDiscoveryResponse[];
65-
@ApiProperty({
66-
type: [String],
67-
description: 'Chain ids where oracles haven been discovered',
68-
})
69-
chainIdsEnabled: string[];
70-
}
7158
export class OracleDiscoveryDto {
7259
@ApiPropertyOptional({ type: [String] })
7360
@IsArray()

packages/apps/human-app/server/src/modules/oracle-discovery/oracle-discovery.controller.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ import { OracleDiscoveryService } from './oracle-discovery.service';
1212
import {
1313
OracleDiscoveryCommand,
1414
OracleDiscoveryDto,
15-
OracleDiscoveryResponse,
16-
OracleDiscoveryResponseDto,
15+
OracleDiscoveryResult,
1716
} from './model/oracle-discovery.model';
1817
import { InjectMapper } from '@automapper/nestjs';
1918
import { Mapper } from '@automapper/core';
@@ -30,13 +29,13 @@ export class OracleDiscoveryController {
3029
@Get('/oracles')
3130
@ApiOperation({ summary: 'Oracles discovery' })
3231
@ApiOkResponse({
33-
type: OracleDiscoveryResponse,
32+
type: Array<OracleDiscoveryResult>,
3433
description: 'List of oracles',
3534
})
3635
@UsePipes(new ValidationPipe())
3736
public async getOracles(
3837
@Query() dto: OracleDiscoveryDto,
39-
): Promise<OracleDiscoveryResponseDto> {
38+
): Promise<OracleDiscoveryResult[]> {
4039
if (!this.environmentConfigService.jobsDiscoveryFlag) {
4140
throw new HttpException(
4241
'Oracles discovery is disabled',

packages/apps/human-app/server/src/modules/oracle-discovery/oracle-discovery.service.ts

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import { Inject, Injectable, Logger } from '@nestjs/common';
22
import {
33
OracleDiscoveryCommand,
4-
OracleDiscoveryResponse,
5-
OracleDiscoveryResponseDto,
4+
OracleDiscoveryResult,
65
} from './model/oracle-discovery.model';
76
import { CACHE_MANAGER } from '@nestjs/cache-manager';
87
import { Cache } from 'cache-manager';
@@ -20,7 +19,7 @@ export class OracleDiscoveryService {
2019

2120
async processOracleDiscovery(
2221
command: OracleDiscoveryCommand,
23-
): Promise<OracleDiscoveryResponseDto> {
22+
): Promise<OracleDiscoveryResult[]> {
2423
const address = this.configService.reputationOracleAddress;
2524
const chainIds = this.configService.chainIdsEnabled;
2625
const oraclesForChainIds = await Promise.all(
@@ -29,10 +28,7 @@ export class OracleDiscoveryService {
2928
),
3029
);
3130

32-
const response: OracleDiscoveryResponseDto = {
33-
oracles: [],
34-
chainIdsEnabled: this.configService.chainIdsEnabled,
35-
};
31+
const oracles: OracleDiscoveryResult[] = [];
3632
for (const oraclesForChainId of oraclesForChainIds) {
3733
for (const oracle of oraclesForChainId) {
3834
if (command.selectedJobTypes?.length) {
@@ -50,19 +46,19 @@ export class OracleDiscoveryService {
5046
}
5147
}
5248

53-
response.oracles.push(oracle);
49+
oracles.push(oracle);
5450
}
5551
}
5652

57-
return response;
53+
return oracles;
5854
}
5955

6056
private async findOraclesByChainId(
6157
chainId: string,
6258
address: string,
63-
): Promise<OracleDiscoveryResponse[]> {
59+
): Promise<OracleDiscoveryResult[]> {
6460
try {
65-
const cachedOracles: OracleDiscoveryResponse[] | undefined =
61+
const cachedOracles: OracleDiscoveryResult[] | undefined =
6662
await this.cacheManager.get(chainId);
6763

6864
if (cachedOracles) {
@@ -76,13 +72,13 @@ export class OracleDiscoveryService {
7672
Role.ExchangeOracle,
7773
);
7874

79-
const oraclesWithRetryData: OracleDiscoveryResponse[] = [];
75+
const oraclesWithRetryData: OracleDiscoveryResult[] = [];
8076
for (const operator of operators) {
8177
const isOperatorValid = !!operator.url;
8278

8379
if (isOperatorValid) {
8480
oraclesWithRetryData.push(
85-
new OracleDiscoveryResponse(
81+
new OracleDiscoveryResult(
8682
operator.address,
8783
chainId,
8884
operator.role,

packages/apps/human-app/server/src/modules/oracle-discovery/spec/oracle-discovery.controller.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { oracleDiscoveryServiceMock } from './oracle-discovery.service.mock';
77
import {
88
OracleDiscoveryCommand,
99
OracleDiscoveryDto,
10-
OracleDiscoveryResponseDto,
10+
OracleDiscoveryResult,
1111
} from '../model/oracle-discovery.model';
1212
import { generateOracleDiscoveryResponseBody } from './oracle-discovery.fixture';
1313
import { OracleDiscoveryProfile } from '../oracle-discovery.mapper.profile';
@@ -68,7 +68,7 @@ describe('OracleDiscoveryController', () => {
6868
const commandFixture = {
6969
selectedJobTypes: ['job-type-1', 'job-type-2'],
7070
} as OracleDiscoveryCommand;
71-
const result: OracleDiscoveryResponseDto =
71+
const result: OracleDiscoveryResult[] =
7272
await controller.getOracles(dtoFixture);
7373
const expectedResponse = generateOracleDiscoveryResponseBody();
7474
expect(serviceMock.processOracleDiscovery).toHaveBeenCalledWith(

0 commit comments

Comments
 (0)