diff --git a/config/default.yaml b/config/default.yaml index 96425d2..58e94b7 100644 --- a/config/default.yaml +++ b/config/default.yaml @@ -38,3 +38,5 @@ runtime: resources: calculation: 'no-distance-simple-multiply' warehouse: 'base-resource-summary' + queue: + resourceConsumer: 'simple-resource-consumer' diff --git a/config/test.yaml b/config/test.yaml index 67ca590..c23a85b 100644 --- a/config/test.yaml +++ b/config/test.yaml @@ -41,3 +41,5 @@ runtime: resources: calculation: 'no-distance-simple-multiply' warehouse: 'base-resource-summary' + queue: + resourceConsumer: 'simple-resource-consumer' diff --git a/src/user/queue/building-queue/add/calculate-resources/resources-calculator.interface.ts b/src/user/queue/building-queue/add/calculate-resources/building-queue-resource-consumer.interface.ts similarity index 78% rename from src/user/queue/building-queue/add/calculate-resources/resources-calculator.interface.ts rename to src/user/queue/building-queue/add/calculate-resources/building-queue-resource-consumer.interface.ts index 66e4673..a4f4e08 100644 --- a/src/user/queue/building-queue/add/calculate-resources/resources-calculator.interface.ts +++ b/src/user/queue/building-queue/add/calculate-resources/building-queue-resource-consumer.interface.ts @@ -3,14 +3,11 @@ import {BuildingModel} from '@warp-core/database/model/building.model'; import {QueueElementCostModel} from '@warp-core/database/model/queue-element-cost.model'; import {AddToQueueInput} from '@warp-core/user/queue/building-queue/input/add-to-queue.input'; -export interface ResourcesCalculatorInterface { +export abstract class BuildingQueueResourceConsumerInterface { /** * Method to calculate resources for queue - * @param addToQueueElement - * @param buildingZone - * @param building */ - calculateResourcesCosts( + public abstract calculateResourcesCosts( addToQueueElement: AddToQueueInput, buildingZone: BuildingZoneModel, building: BuildingModel, diff --git a/src/user/queue/building-queue/add/calculate-resources/simple-calculation.service.spec.ts b/src/user/queue/building-queue/add/calculate-resources/simple-calculation.service.spec.ts index fcc90d9..e1781f7 100644 --- a/src/user/queue/building-queue/add/calculate-resources/simple-calculation.service.spec.ts +++ b/src/user/queue/building-queue/add/calculate-resources/simple-calculation.service.spec.ts @@ -32,34 +32,6 @@ describe('Simple calculation of resources for queue element', () => { }, queueCosts: [], }, - { - name: 'empty queue cost when demanded resources are not construction related', - addToQueue: { - endLevel: 2, - }, - buildingZone: { - level: 1, - }, - building: { - buildingDetailsAtCertainLevel: [ - { - level: 1, - }, - { - level: 2, - requirements: [ - { - resource: { - type: ResourceTypeEnum.TECHNOLOGY_RESOURCE, - }, - cost: 5, - }, - ], - }, - ], - }, - queueCosts: [], - }, { name: 'single resource in queue cost when update require one resource', addToQueue: { @@ -78,7 +50,7 @@ describe('Simple calculation of resources for queue element', () => { requirements: [ { resource: { - type: ResourceTypeEnum.CONSTRUCTION_RESOURCE, + type: ResourceTypeEnum.TECHNOLOGY_RESOURCE, }, cost: 5, }, @@ -90,7 +62,7 @@ describe('Simple calculation of resources for queue element', () => { { cost: 5, resource: { - type: ResourceTypeEnum.CONSTRUCTION_RESOURCE, + type: ResourceTypeEnum.TECHNOLOGY_RESOURCE, }, }, ], @@ -147,9 +119,9 @@ describe('Simple calculation of resources for queue element', () => { ], }, { - name: 'single resource in queue cost when update by multiple levels require one resource', + name: 'multiple resource types in queue cost when update by one level require two resources', addToQueue: { - endLevel: 3, + endLevel: 2, }, buildingZone: { level: 1, @@ -164,20 +136,15 @@ describe('Simple calculation of resources for queue element', () => { requirements: [ { resource: { - id: 'coal', + id: 'wood', type: ResourceTypeEnum.CONSTRUCTION_RESOURCE, }, cost: 5, }, - ], - }, - { - level: 3, - requirements: [ { resource: { id: 'coal', - type: ResourceTypeEnum.CONSTRUCTION_RESOURCE, + type: ResourceTypeEnum.ENERGY_RESOURCE, }, cost: 10, }, @@ -188,17 +155,24 @@ describe('Simple calculation of resources for queue element', () => { queueCosts: [ { resource: { - id: 'coal', + id: 'wood', type: ResourceTypeEnum.CONSTRUCTION_RESOURCE, }, - cost: 15, + cost: 5, + }, + { + resource: { + id: 'coal', + type: ResourceTypeEnum.ENERGY_RESOURCE, + }, + cost: 10, }, ], }, { - name: 'multiple resources in queue cost when update by multiple levels require multiple resources', + name: 'single resource in queue cost when update by multiple levels require one resource', addToQueue: { - endLevel: 5, + endLevel: 3, }, buildingZone: { level: 1, @@ -230,44 +204,6 @@ describe('Simple calculation of resources for queue element', () => { }, cost: 10, }, - { - resource: { - id: 'wood', - type: ResourceTypeEnum.CONSTRUCTION_RESOURCE, - }, - cost: 5, - }, - ], - }, - { - level: 4, - requirements: [ - { - resource: { - id: 'coal', - type: ResourceTypeEnum.CONSTRUCTION_RESOURCE, - }, - cost: 30, - }, - { - resource: { - id: 'wood', - type: ResourceTypeEnum.CONSTRUCTION_RESOURCE, - }, - cost: 50, - }, - ], - }, - { - level: 5, - requirements: [ - { - resource: { - id: 'wood', - type: ResourceTypeEnum.CONSTRUCTION_RESOURCE, - }, - cost: 75, - }, ], }, ], @@ -278,19 +214,12 @@ describe('Simple calculation of resources for queue element', () => { id: 'coal', type: ResourceTypeEnum.CONSTRUCTION_RESOURCE, }, - cost: 45, - }, - { - resource: { - id: 'wood', - type: ResourceTypeEnum.CONSTRUCTION_RESOURCE, - }, - cost: 130, + cost: 15, }, ], }, { - name: 'multiple resources in queue cost when update by multiple levels require multiple resources but not all resources are construction type', + name: 'multiple resources in queue cost when update by multiple levels require multiple resources', addToQueue: { endLevel: 5, }, @@ -312,13 +241,6 @@ describe('Simple calculation of resources for queue element', () => { }, cost: 5, }, - { - resource: { - id: 'brain', - type: ResourceTypeEnum.TECHNOLOGY_RESOURCE, - }, - cost: 1, - }, ], }, { @@ -338,13 +260,6 @@ describe('Simple calculation of resources for queue element', () => { }, cost: 5, }, - { - resource: { - id: 'brain', - type: ResourceTypeEnum.TECHNOLOGY_RESOURCE, - }, - cost: 1, - }, ], }, { @@ -376,13 +291,6 @@ describe('Simple calculation of resources for queue element', () => { }, cost: 75, }, - { - resource: { - id: 'brain', - type: ResourceTypeEnum.TECHNOLOGY_RESOURCE, - }, - cost: 1, - }, ], }, ], diff --git a/src/user/queue/building-queue/add/calculate-resources/simple-calculation.service.ts b/src/user/queue/building-queue/add/calculate-resources/simple-calculation.service.ts index b501517..3ed79e9 100644 --- a/src/user/queue/building-queue/add/calculate-resources/simple-calculation.service.ts +++ b/src/user/queue/building-queue/add/calculate-resources/simple-calculation.service.ts @@ -1,15 +1,18 @@ import {Injectable} from '@nestjs/common'; -import {ResourceTypeEnum} from '@warp-core/database/enum/resource-type.enum'; +import {AddMechanic} from '@warp-core/core/utils/mechanics'; import {BuildingZoneModel} from '@warp-core/database/model/building-zone.model'; import {BuildingModel} from '@warp-core/database/model/building.model'; import {QueueElementCostModel} from '@warp-core/database/model/queue-element-cost.model'; import {ResourceModel} from '@warp-core/database/model/resource.model'; -import {ResourcesCalculatorInterface} from '@warp-core/user/queue/building-queue/add/calculate-resources/resources-calculator.interface'; +import {BuildingQueueResourceConsumerInterface} from '@warp-core/user/queue/building-queue/add/calculate-resources/building-queue-resource-consumer.interface'; import {AddToQueueInput} from '@warp-core/user/queue/building-queue/input/add-to-queue.input'; @Injectable() -export class SimpleCalculationService implements ResourcesCalculatorInterface { +@AddMechanic(BuildingQueueResourceConsumerInterface, 'simple-resource-consumer') +export class SimpleCalculationService + implements BuildingQueueResourceConsumerInterface +{ public async calculateResourcesCosts( addToQueueElement: AddToQueueInput, buildingZone: BuildingZoneModel, @@ -33,10 +36,6 @@ export class SimpleCalculationService implements ResourcesCalculatorInterface { for (const buildingUpdateCost of buildingUpdateCosts) { const resource = await buildingUpdateCost.resource; - - if (resource.type !== ResourceTypeEnum.CONSTRUCTION_RESOURCE) { - continue; - } this.addToQueueCost(queueCost, resource, buildingUpdateCost.cost); } } diff --git a/src/user/queue/building-queue/add/prepare-single-building-queue-element.service.spec.ts b/src/user/queue/building-queue/add/prepare-single-building-queue-element.service.spec.ts index 43e2b0d..3ea0916 100644 --- a/src/user/queue/building-queue/add/prepare-single-building-queue-element.service.spec.ts +++ b/src/user/queue/building-queue/add/prepare-single-building-queue-element.service.spec.ts @@ -9,7 +9,7 @@ import {QueueElementCostModel} from '@warp-core/database/model/queue-element-cos import {BuildingQueueRepository} from '@warp-core/database/repository/building-queue.repository'; import {BuildingZoneRepository} from '@warp-core/database/repository/building-zone.repository'; import {BuildingQueryEmitter} from '@warp-core/global/building'; -import {ResourcesCalculatorInterface} from '@warp-core/user/queue/building-queue/add/calculate-resources/resources-calculator.interface'; +import {BuildingQueueResourceConsumerInterface} from '@warp-core/user/queue/building-queue/add/calculate-resources/building-queue-resource-consumer.interface'; import {PrepareSingleBuildingQueueElementService} from '@warp-core/user/queue/building-queue/add/prepare-single-building-queue-element.service'; import {AddToQueueInput} from '@warp-core/user/queue/building-queue/input/add-to-queue.input'; @@ -25,7 +25,7 @@ describe('Prepare single building queue element tests', () => { let buildingZoneRepository: jest.Mocked; let buildingService: jest.Mocked; let habitatMock: jest.Mocked; - let resourcesCalculator: ResourcesCalculatorInterface; + let resourcesCalculator: BuildingQueueResourceConsumerInterface; beforeEach(async () => { jest.clearAllMocks(); @@ -42,7 +42,7 @@ describe('Prepare single building queue element tests', () => { BuildingQueryEmitter, AuthorizedHabitatModel, { - provide: 'QUEUE_ADD_CALCULATION', + provide: BuildingQueueResourceConsumerInterface, useValue: resourcesCalculator, }, ], diff --git a/src/user/queue/building-queue/add/prepare-single-building-queue-element.service.ts b/src/user/queue/building-queue/add/prepare-single-building-queue-element.service.ts index 8a74b6a..7dff26b 100644 --- a/src/user/queue/building-queue/add/prepare-single-building-queue-element.service.ts +++ b/src/user/queue/building-queue/add/prepare-single-building-queue-element.service.ts @@ -1,4 +1,4 @@ -import {Inject, Injectable} from '@nestjs/common'; +import {Injectable} from '@nestjs/common'; import {DateTime} from 'luxon'; import {AuthorizedHabitatModel} from '@warp-core/auth'; @@ -9,15 +9,14 @@ import {BuildingModel} from '@warp-core/database/model/building.model'; import {BuildingQueueRepository} from '@warp-core/database/repository/building-queue.repository'; import {BuildingZoneRepository} from '@warp-core/database/repository/building-zone.repository'; import {BuildingQueryEmitter} from '@warp-core/global/building'; -import {ResourcesCalculatorInterface} from '@warp-core/user/queue/building-queue/add/calculate-resources/resources-calculator.interface'; +import {BuildingQueueResourceConsumerInterface} from '@warp-core/user/queue/building-queue/add/calculate-resources/building-queue-resource-consumer.interface'; import {QueueError} from '@warp-core/user/queue/building-queue/exception/queue.error'; import {AddToQueueInput} from '@warp-core/user/queue/building-queue/input/add-to-queue.input'; @Injectable() export class PrepareSingleBuildingQueueElementService { constructor( - @Inject('QUEUE_ADD_CALCULATION') - protected readonly calculationService: ResourcesCalculatorInterface, + protected readonly calculationService: BuildingQueueResourceConsumerInterface, protected readonly buildingQueueRepository: BuildingQueueRepository, protected readonly buildingZoneRepository: BuildingZoneRepository, protected readonly buildingService: BuildingQueryEmitter, diff --git a/src/user/queue/building-queue/building-queue.module.ts b/src/user/queue/building-queue/building-queue.module.ts index d2faabd..1116a84 100644 --- a/src/user/queue/building-queue/building-queue.module.ts +++ b/src/user/queue/building-queue/building-queue.module.ts @@ -2,11 +2,13 @@ import {MiddlewareConsumer, Module, NestModule} from '@nestjs/common'; import {AuthModule} from '@warp-core/auth'; import {CoreConfigModule} from '@warp-core/core/config/core-config.module'; +import {RegisterMechanic} from '@warp-core/core/utils/mechanics'; import {DatabaseModule} from '@warp-core/database/database.module'; import {BuildingQueryEmitter} from '@warp-core/global/building'; import {BuildingZoneEmitter} from '@warp-core/user/building-zone/exchange'; import {BuildingQueueAddService} from '@warp-core/user/queue/building-queue/add/building-queue-add.service'; import {BuildingQueueDraftService} from '@warp-core/user/queue/building-queue/add/building-queue-draft.service'; +import {BuildingQueueResourceConsumerInterface} from '@warp-core/user/queue/building-queue/add/calculate-resources/building-queue-resource-consumer.interface'; import {SimpleCalculationService} from '@warp-core/user/queue/building-queue/add/calculate-resources/simple-calculation.service'; import {PrepareSingleBuildingQueueElementService} from '@warp-core/user/queue/building-queue/add/prepare-single-building-queue-element.service'; import {BuildingQueueHandlerService} from '@warp-core/user/queue/building-queue/building-queue-handler.service'; @@ -40,10 +42,11 @@ import {QueueConsumerMiddleware} from '@warp-core/user/queue/building-queue/queu BuildingQueueProcessingEmitter, ValidateSingleQueueElementService, QueueConsumerMiddleware, - { - provide: 'QUEUE_ADD_CALCULATION', - useClass: SimpleCalculationService, - }, + SimpleCalculationService, + RegisterMechanic.forFeature( + BuildingQueueResourceConsumerInterface, + 'runtime.mechanics.queue.resourceConsumer', + ), ], imports: [DatabaseModule, CoreConfigModule, AuthModule], })