diff --git a/sge-backend/src/main/java/com/sgs/SgsApplication.java b/sge-backend/src/main/java/com/sgs/SgsApplication.java index cface1e..0ce8d67 100644 --- a/sge-backend/src/main/java/com/sgs/SgsApplication.java +++ b/sge-backend/src/main/java/com/sgs/SgsApplication.java @@ -865,7 +865,7 @@ public class SgsApplication implements CommandLineRunner { if (neighborhoodService.findAll().isEmpty()) { createNeighborhoodsFromJson(); } - if (areaService.findAll().isEmpty()) { + if (!cityService.findAll().isEmpty()) { createDefaultArea(); } } diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/query/DataCenterQueryResolver.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/query/DataCenterQueryResolver.java index a763132..b3396c1 100644 --- a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/query/DataCenterQueryResolver.java +++ b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/query/DataCenterQueryResolver.java @@ -15,8 +15,10 @@ import org.springframework.stereotype.Component; import com.sgs.graphql.auth.service.AuthorizationService; import com.sgs.graphql.dataCenter.domain.DataCenter; +import com.sgs.graphql.dataCenter.domain.PhysicalMachine; import com.sgs.graphql.dataCenter.query.pagination.DataCenterPageable; import com.sgs.graphql.dataCenter.repo.DataCenterRepo; +import com.sgs.graphql.dataCenter.repo.PhysicalMachineRepo; import com.sgs.graphql.dataCenter.repo.criteria.DataCenterCriteria; import com.sgs.graphql.dataCenter.service.DataCenterService; import com.sgs.graphql.systemHistory.mutation.SystemLogger; @@ -30,13 +32,15 @@ public class DataCenterQueryResolver implements GraphQLQueryResolver { private final DataCenterService DataCenterService; private final DataCenterRepo dataCenterRepo; + private final PhysicalMachineRepo physicalMachineRepo; private final AuthorizationService authorizationService; private final SystemLogger systemLogger; @Autowired - public DataCenterQueryResolver(AuthorizationService authorizationService, SystemLogger systemLogger, DataCenterService DataCenterService, DataCenterRepo dataCenterRepo) { + public DataCenterQueryResolver(AuthorizationService authorizationService, SystemLogger systemLogger, DataCenterService DataCenterService, DataCenterRepo dataCenterRepo, PhysicalMachineRepo physicalMachineRepo) { this.DataCenterService = DataCenterService; this.dataCenterRepo = dataCenterRepo; + this.physicalMachineRepo = physicalMachineRepo; this.authorizationService = authorizationService; this.systemLogger = systemLogger; } @@ -66,4 +70,8 @@ public class DataCenterQueryResolver implements GraphQLQueryResolver { return dataCenterRepo.findByNumber(id).stream().findFirst(); } + public List physicalMachines(UUID datacenterId, UUID projectId) { + return physicalMachineRepo.findByDatacenterIdAndProjectId(datacenterId, projectId); + } + } diff --git a/sge-backend/src/main/java/com/sgs/graphql/dataCenter/repo/PhysicalMachineRepo.java b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/repo/PhysicalMachineRepo.java new file mode 100644 index 0000000..5d7fa00 --- /dev/null +++ b/sge-backend/src/main/java/com/sgs/graphql/dataCenter/repo/PhysicalMachineRepo.java @@ -0,0 +1,27 @@ +package com.sgs.graphql.dataCenter.repo; + +import com.sgs.graphql.dataCenter.domain.PhysicalMachine; +import com.sgs.lib.dao.repo.BaseRepo; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.UUID; + +@Repository +public interface PhysicalMachineRepo extends BaseRepo { + + /** + * Find all physical machines by datacenter ID and project ID + * @param datacenterId Datacenter ID + * @param projectId Project ID + * @return List of physical machines + */ + @Query("SELECT pm FROM PhysicalMachine pm " + + "JOIN pm.project p " + + "JOIN p.dataCenter dc " + + "WHERE dc.id = :datacenterId AND p.id = :projectId") + List findByDatacenterIdAndProjectId(@Param("datacenterId") UUID datacenterId, + @Param("projectId") UUID projectId); +} diff --git a/sge-backend/src/main/java/com/sgs/graphql/mainDataTable/query/MainDataTableQueryResolver.java b/sge-backend/src/main/java/com/sgs/graphql/mainDataTable/query/MainDataTableQueryResolver.java index 3f56e9c..2fb2246 100644 --- a/sge-backend/src/main/java/com/sgs/graphql/mainDataTable/query/MainDataTableQueryResolver.java +++ b/sge-backend/src/main/java/com/sgs/graphql/mainDataTable/query/MainDataTableQueryResolver.java @@ -51,9 +51,11 @@ public class MainDataTableQueryResolver implements GraphQLQueryResolver { /** * GraphQL query to get VM emission summaries with hierarchy information + * @param datacenterId Optional datacenter ID to filter VMs by datacenter + * @param projectId Optional project ID to filter VMs by project * @return List of VM emission summaries including datacenter, project, aggregate, and physical machine info */ - public List vmEmissionSummary() { - return mainDataTableService.getVMEmissionSummaries(); + public List vmEmissionSummary(UUID datacenterId, UUID projectId) { + return mainDataTableService.getVMEmissionSummaries(datacenterId, projectId); } } diff --git a/sge-backend/src/main/java/com/sgs/graphql/mainDataTable/service/MainDataTableService.java b/sge-backend/src/main/java/com/sgs/graphql/mainDataTable/service/MainDataTableService.java index ff87c71..77eb142 100644 --- a/sge-backend/src/main/java/com/sgs/graphql/mainDataTable/service/MainDataTableService.java +++ b/sge-backend/src/main/java/com/sgs/graphql/mainDataTable/service/MainDataTableService.java @@ -9,6 +9,7 @@ import com.sgs.lib.dao.service.BaseService; import com.sgs.graphql.mainDataTable.dto.VMEmissionSummary; import java.sql.Timestamp; +import java.util.ArrayList; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @@ -32,12 +33,33 @@ public class MainDataTableService extends BaseService getVMEmissionSummaries() { + return getVMEmissionSummaries(null, null); + } + + public List getVMEmissionSummaries(UUID datacenterId) { + return getVMEmissionSummaries(datacenterId, null); + } + + public List getVMEmissionSummaries(UUID datacenterId, UUID projectId) { + List whereConditions = new ArrayList<>(); + + if (datacenterId != null) { + whereConditions.add("dc.id = decode(replace(:datacenterId, '-', ''), 'hex')"); + } + + if (projectId != null) { + whereConditions.add("p.id = decode(replace(:projectId, '-', ''), 'hex')"); + } + + String whereClause = whereConditions.isEmpty() ? "" : + "WHERE " + String.join(" AND ", whereConditions) + " "; + String sql = """ SELECT CAST(v.id AS VARCHAR) as vm_id, - v.name as vm_name, + v.vm_name as vm_name, v.power as vm_power, - v.status as vm_status, + v.state as vm_status, mdt.total_emission, mdt.created_date, pm.name as physical_machine_name, @@ -48,15 +70,24 @@ public class MainDataTableService extends BaseService results = query.getResultList(); diff --git a/sge-backend/src/main/resources/graphql/dataCenter/query.graphqls b/sge-backend/src/main/resources/graphql/dataCenter/query.graphqls index 5dab060..76b327e 100644 --- a/sge-backend/src/main/resources/graphql/dataCenter/query.graphqls +++ b/sge-backend/src/main/resources/graphql/dataCenter/query.graphqls @@ -3,4 +3,5 @@ extend type Query{ dataCenters(criteria: DataCenterCriteria, sortBy: [SortBy!]): [DataCenter!] paginateDataCenters(pagination : Pagination!, criteria: DataCenterCriteria, sortBy:[SortBy!] ) : DataCenterPageable! getByNumber(number: Int!): DataCenter + physicalMachines(datacenterId: ID!, projectId: ID!): [PhysicalMachine!]! } \ No newline at end of file diff --git a/sge-backend/src/main/resources/graphql/dataCenter/type.graphqls b/sge-backend/src/main/resources/graphql/dataCenter/type.graphqls index a96fb1e..9eee493 100644 --- a/sge-backend/src/main/resources/graphql/dataCenter/type.graphqls +++ b/sge-backend/src/main/resources/graphql/dataCenter/type.graphqls @@ -25,6 +25,7 @@ type Project { id: ID name: String physicalMachines: [PhysicalMachine] + dataCenter: DataCenter } type PhysicalMachine { @@ -34,6 +35,7 @@ type PhysicalMachine { tag: String power: Float vms: [Vm] + project: Project } type Vm { @@ -49,6 +51,7 @@ type Vm { tag: String emissionSource: EmissionSourceMap config: Config + physicalMachine: PhysicalMachine } scalar EmissionSourceMap diff --git a/sge-backend/src/main/resources/graphql/mainDataTable/query.graphqls b/sge-backend/src/main/resources/graphql/mainDataTable/query.graphqls index f06327c..5a05347 100644 --- a/sge-backend/src/main/resources/graphql/mainDataTable/query.graphqls +++ b/sge-backend/src/main/resources/graphql/mainDataTable/query.graphqls @@ -2,5 +2,5 @@ extend type Query{ mainDataTable(id: ID!): MainDataTable! mainDataTables(criteria: MainDataTableCriteria, sortBy: [SortBy!]): [MainDataTable!] paginateMainDataTables(pagination : Pagination!, criteria: MainDataTableCriteria, sortBy:[SortBy!] ) : MainDataTablePageable! - vmEmissionSummary: [VMEmissionSummary!]! + vmEmissionSummary(datacenterId: ID, projectId: ID): [VMEmissionSummary!]! } \ No newline at end of file diff --git a/sge-backend/src/main/resources/graphql/mainDataTable/type.graphqls b/sge-backend/src/main/resources/graphql/mainDataTable/type.graphqls index 416bd06..d5cabde 100644 --- a/sge-backend/src/main/resources/graphql/mainDataTable/type.graphqls +++ b/sge-backend/src/main/resources/graphql/mainDataTable/type.graphqls @@ -51,22 +51,22 @@ type Config { disk: Int } -type VMEmissionSummary { - vmId: ID! - vmName: String! - vmPower: Float - vmStatus: String - totalEmission: Float! - createdDate: LocalDateTime! - physicalMachine: String - project: String - dataCenter: String - # Individual emission values per record - co2: Float! - ch4: Float! - n2o: Float! - reportGeneratedTime: LocalDateTime -} + type VMEmissionSummary { + vmId: ID! + vmName: String + vmPower: Float + vmStatus: String + totalEmission: Float! + createdDate: LocalDateTime! + physicalMachine: String + project: String + dataCenter: String + # Individual emission values per record + co2: Float! + ch4: Float! + n2o: Float! + reportGeneratedTime: LocalDateTime + } type SolidWasteSupplement { id: ID!