Skip to content

Commit

Permalink
MEX-322: fragments & filters
Browse files Browse the repository at this point in the history
  • Loading branch information
dragos-rebegea committed Jul 17, 2023
1 parent 8614afc commit 941fb3e
Show file tree
Hide file tree
Showing 8 changed files with 75 additions and 42 deletions.
46 changes: 23 additions & 23 deletions src/modules/governance/governance.contract.resolver.ts
Original file line number Diff line number Diff line change
@@ -1,62 +1,62 @@
import { Parent, ResolveField, Resolver } from '@nestjs/graphql';
import { GovernanceAbiService } from './services/governance.abi.service';
import { GovernanceContract } from './models/governance.contract.model';
import { EnergyContract } from './models/energy.contract.model';
import { GovernanceProposal } from './models/governance.proposal.model';

@Resolver(() => GovernanceContract)
export class GovernanceContractResolver {
@Resolver(() => EnergyContract)
export class EnergyContractResolver {
constructor(
private readonly governanceAbi: GovernanceAbiService,
) {
}

@ResolveField()
async minEnergyForPropose(@Parent() governanceContract: GovernanceContract): Promise<string> {
return this.governanceAbi.minEnergyForPropose(governanceContract.address);
async minEnergyForPropose(@Parent() energyContract: EnergyContract): Promise<string> {
return this.governanceAbi.minEnergyForPropose(energyContract.address);
}

@ResolveField()
async minFeeForPropose(@Parent() governanceContract: GovernanceContract): Promise<string> {
return this.governanceAbi.minFeeForPropose(governanceContract.address);
async minFeeForPropose(@Parent() energyContract: EnergyContract): Promise<string> {
return this.governanceAbi.minFeeForPropose(energyContract.address);
}

@ResolveField()
async quorum(@Parent() governanceContract: GovernanceContract): Promise<string> {
return this.governanceAbi.quorum(governanceContract.address);
async quorum(@Parent() energyContract: EnergyContract): Promise<string> {
return this.governanceAbi.quorum(energyContract.address);
}

@ResolveField()
async votingDelayInBlocks(@Parent() governanceContract: GovernanceContract): Promise<number> {
return this.governanceAbi.votingDelayInBlocks(governanceContract.address);
async votingDelayInBlocks(@Parent() energyContract: EnergyContract): Promise<number> {
return this.governanceAbi.votingDelayInBlocks(energyContract.address);
}

@ResolveField()
async votingPeriodInBlocks(@Parent() governanceContract: GovernanceContract): Promise<number> {
return this.governanceAbi.votingPeriodInBlocks(governanceContract.address);
async votingPeriodInBlocks(@Parent() energyContract: EnergyContract): Promise<number> {
return this.governanceAbi.votingPeriodInBlocks(energyContract.address);
}

@ResolveField()
async feeTokenId(@Parent() governanceContract: GovernanceContract): Promise<string> {
return this.governanceAbi.feeTokenId(governanceContract.address);
async feeTokenId(@Parent() energyContract: EnergyContract): Promise<string> {
return this.governanceAbi.feeTokenId(energyContract.address);
}

@ResolveField()
async withdrawPercentageDefeated(@Parent() governanceContract: GovernanceContract): Promise<number> {
return this.governanceAbi.withdrawPercentageDefeated(governanceContract.address);
async withdrawPercentageDefeated(@Parent() energyContract: EnergyContract): Promise<number> {
return this.governanceAbi.withdrawPercentageDefeated(energyContract.address);
}

@ResolveField(() => [GovernanceProposal])
async proposals(@Parent() governanceContract: GovernanceContract): Promise<GovernanceProposal[]> {
return this.governanceAbi.proposals(governanceContract.address);
async proposals(@Parent() energyContract: EnergyContract): Promise<GovernanceProposal[]> {
return this.governanceAbi.proposals(energyContract.address);
}

@ResolveField()
async feesCollectorAddress(@Parent() governanceContract: GovernanceContract): Promise<string> {
return this.governanceAbi.feesCollectorAddress(governanceContract.address);
async feesCollectorAddress(@Parent() energyContract: EnergyContract): Promise<string> {
return this.governanceAbi.feesCollectorAddress(energyContract.address);
}

@ResolveField()
async energyFactoryAddress(@Parent() governanceContract: GovernanceContract): Promise<string> {
return this.governanceAbi.energyFactoryAddress(governanceContract.address);
async energyFactoryAddress(@Parent() energyContract: EnergyContract): Promise<string> {
return this.governanceAbi.energyFactoryAddress(energyContract.address);
}
}
4 changes: 2 additions & 2 deletions src/modules/governance/governance.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { TokenModule } from '../tokens/token.module';
import { EnergyModule } from '../energy/energy.module';
import { GovernanceAbiService } from './services/governance.abi.service';
import { GovernanceQueryResolver } from './governance.query.resolver';
import { GovernanceContractResolver } from './governance.contract.resolver';
import { EnergyContractResolver } from './governance.contract.resolver';
import { GovernanceProposalResolver } from './governance.propose.resolver';
import { GovernanceService } from './services/governance.service';

Expand All @@ -28,7 +28,7 @@ import { GovernanceService } from './services/governance.service';
// GovernanceComputeService,
// GovernanceTransactionService,
GovernanceQueryResolver,
GovernanceContractResolver,
EnergyContractResolver,
GovernanceProposalResolver,
],
exports: [
Expand Down
6 changes: 3 additions & 3 deletions src/modules/governance/governance.query.resolver.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Args, Query, Resolver } from '@nestjs/graphql';
import { GovernanceContractsFiltersArgs } from './models/contracts.filter.args';
import { GovernanceService } from './services/governance.service';
import { GovernanceContract } from './models/governance.contract.model';
import { GovernanceUnion } from './models/governance.union';

@Resolver()
export class GovernanceQueryResolver {
Expand All @@ -10,10 +10,10 @@ export class GovernanceQueryResolver {
) {
}

@Query(() => [GovernanceContract])
@Query(() => [GovernanceUnion])
async governanceContracts(
@Args() filters: GovernanceContractsFiltersArgs
): Promise<GovernanceContract[]> {
): Promise<Array<typeof GovernanceUnion>> {
return this.governanceService.getGovernanceContracts(filters);
}
}
3 changes: 2 additions & 1 deletion src/modules/governance/models/contracts.filter.args.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { ArgsType, Field } from '@nestjs/graphql';
import { GovernanceType } from './energy.contract.model';

@ArgsType()
export class GovernanceContractsFiltersArgs {
Expand All @@ -7,5 +8,5 @@ export class GovernanceContractsFiltersArgs {
@Field(() => [String], { nullable: true })
contracts: string;
@Field({ nullable: true })
type: string;
type: GovernanceType;
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
import { Field, Int, ObjectType } from '@nestjs/graphql';
import { Field, Int, ObjectType, registerEnumType } from '@nestjs/graphql';
import { GovernanceProposal } from './governance.proposal.model';

export enum GovernanceType {
ENERGY = 'energy',
TOKEN = 'token',
}

registerEnumType(GovernanceType, { name: 'GovernanceType' });

@ObjectType()
export class GovernanceContract {
export class EnergyContract {
@Field()
address: string;
@Field()
Expand All @@ -31,7 +33,7 @@ export class GovernanceContract {
@Field()
energyFactoryAddress: string;

constructor(init: Partial<GovernanceContract>) {
constructor(init: Partial<EnergyContract>) {
Object.assign(this, init);
}
}
16 changes: 16 additions & 0 deletions src/modules/governance/models/governance.union.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { createUnionType } from '@nestjs/graphql';
import { EnergyContract } from './energy.contract.model';

export const GovernanceUnion = createUnionType({
name: 'GovernanceTypes',
types: () =>
[
EnergyContract,
] as const,
resolveType(governance) {
switch (governance.constructor.name) {
case EnergyContract.name:
return EnergyContract;
}
},
});
32 changes: 23 additions & 9 deletions src/modules/governance/services/governance.service.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,39 @@
import { Injectable } from '@nestjs/common';
import { GovernanceContract } from '../models/governance.contract.model';
import { governanceContractsAddresses } from '../../../utils/governance';
import { EnergyContract, GovernanceType } from '../models/energy.contract.model';
import { governanceContractsAddresses, governanceType } from '../../../utils/governance';
import { GovernanceContractsFiltersArgs } from '../models/contracts.filter.args';
import { GovernanceAbiService } from './governance.abi.service';
import { GovernanceUnion } from '../models/governance.union';

@Injectable()
export class GovernanceService {
constructor(
private readonly governanceAbi: GovernanceAbiService,
) {
}
async getGovernanceContracts(filters: GovernanceContractsFiltersArgs): Promise<GovernanceContract[]> {
async getGovernanceContracts(filters: GovernanceContractsFiltersArgs): Promise<Array<typeof GovernanceUnion>> {
const governanceAddresses = governanceContractsAddresses();

const governance: GovernanceContract[] = [];
if (filters.contracts) {
governanceAddresses.filter((address) => !filters.contracts.includes(address));
}

const governance: EnergyContract[] = [];
for (const address of governanceAddresses) {
governance.push(
new GovernanceContract({
address,
}),
);
const type = governanceType(address);
if (filters.type && filters.type !== type) {
continue;
}
switch (type) {
case GovernanceType.ENERGY:
governance.push(
new EnergyContract({
address,
}),
);
break;
}

}

return governance;
Expand Down
2 changes: 1 addition & 1 deletion src/utils/governance.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { GovernanceType } from '../modules/governance/models/governance.contract.model';
import { GovernanceType } from '../modules/governance/models/energy.contract.model';
import { scAddress } from '../config';
import { GovernanceProposalStatus } from '../modules/governance/models/governance.proposal.model';

Expand Down

0 comments on commit 941fb3e

Please sign in to comment.