Commit cbcdba25 authored by kkichaan's avatar kkichaan

Merge branch 'subash' into 'master'

Account Metrics and Summary APIs

See merge request !5
parents 82034db1 4f8086d8
No preview for this file type
package com.altimetrik.pmis.Exception;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import java.util.HashMap;
import java.util.Map;
@ControllerAdvice
public class PMISExceptionHandler extends ResponseEntityExceptionHandler {
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(
MethodArgumentNotValidException ex, HttpHeaders headers,
HttpStatusCode status, WebRequest request) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach((error) -> {
String fieldName = ((FieldError) error).getField();
String message = error.getDefaultMessage();
errors.put(fieldName, message);
});
return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
}
}
......@@ -2,14 +2,17 @@ package com.altimetrik.pmis.controller;
import com.altimetrik.pmis.model.Indicator;
import com.altimetrik.pmis.service.IndicatorService;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/indicator")
@Validated
public class IndicatorController {
private IndicatorService indicatorService;
......@@ -20,7 +23,7 @@ public class IndicatorController {
}
@PostMapping("save")
ResponseEntity<Indicator> save(@RequestBody Indicator indicator) {
ResponseEntity<Indicator> save(@Valid @RequestBody Indicator indicator) {
return ResponseEntity.ok(indicatorService.save(indicator));
}
......
//package com.altimetrik.pmis.controller;
//
//import com.altimetrik.pmis.core.entity.Metrics;
//import com.altimetrik.pmis.service.MetricsService;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.http.ResponseEntity;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestBody;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
//@RestController
//@RequestMapping("/metrics")
//public class MetricsController {
// private final MetricsService metricsService;
//
// @Autowired
// private MetricsController(MetricsService metricsService) {
// this.metricsService = metricsService;
// }
//
// @PostMapping
// public ResponseEntity<Metrics> save(@RequestBody Metrics metrics) {
// return ResponseEntity.ok(metricsService.save(metrics));
// }
//}
package com.altimetrik.pmis.controller;
import com.altimetrik.pmis.model.Metric;
import com.altimetrik.pmis.service.MetricsService;
import jakarta.websocket.server.PathParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.Objects;
@RestController
@RequestMapping("/metrics")
public class MetricsController {
private final MetricsService metricsService;
@Autowired
private MetricsController(MetricsService metricsService) {
this.metricsService = metricsService;
}
@PostMapping("/account")
public ResponseEntity<Metric> save(@RequestBody Metric metric) {
return ResponseEntity.ok(metricsService.save(metric));
}
@GetMapping("account/{accountId}")
public ResponseEntity<Metric> getByAccountId(@PathParam("accountId") Long accountId) {
Metric metric = metricsService.getByAccountId(accountId);
if (Objects.isNull(metric)) {
return ResponseEntity.noContent().build();
}
return ResponseEntity.ok(metricsService.getByAccountId(accountId));
}
}
package com.altimetrik.pmis.controller;
import com.altimetrik.pmis.model.CreateProjectSummaryRequest;
import com.altimetrik.pmis.model.Project;
import com.altimetrik.pmis.model.ProjectSummary;
import com.altimetrik.pmis.service.ProjectService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDate;
import java.util.List;
@RestController
......@@ -32,4 +36,19 @@ public class ProjectController {
public ResponseEntity<List<Project>> getByAccount(@PathVariable Long accountId) {
return ResponseEntity.ok(projectService.getByAccount(accountId));
}
@PostMapping("/summary")
public ResponseEntity<List<ProjectSummary>> createProjectSummary(@RequestBody CreateProjectSummaryRequest createProjectSummaryRequest) {
return ResponseEntity.ok(projectService.createProjectSummary(createProjectSummaryRequest));
}
@GetMapping("/summary/account/{accountId}/reportDate/{reportDate}")
public ResponseEntity<List<ProjectSummary>> getProjectSummaryByAccountId(@PathVariable("accountId") Long accountId, @PathVariable("reportDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate reportDate) {
return ResponseEntity.ok(projectService.getProjectSummaryByAccountIdAndReportDate(accountId, reportDate));
}
@PutMapping("/summary")
public ResponseEntity<ProjectSummary> updateProjectSummary(@RequestBody ProjectSummary projectSummary) {
return ResponseEntity.ok(projectService.updateProjectSummary(projectSummary));
}
}
......@@ -13,6 +13,10 @@ import java.util.List;
@AllArgsConstructor
@Builder
public class AccountEntity {
@OneToMany(mappedBy = "account")
List<AccountMetricEntity> accountMetricEntities;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
......@@ -23,6 +27,9 @@ public class AccountEntity {
@Column(length = 100)
private String head;
@Column
private String headEmail;
@Column(length = 100)
private String clientPartner;
......@@ -31,4 +38,5 @@ public class AccountEntity {
@Column
private String description;
}
package com.altimetrik.pmis.core.entity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.*;
@Entity
@Table(name = "tbl_account_metric")
......@@ -12,16 +9,17 @@ import lombok.Setter;
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AccountMetricEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne
@ManyToOne
@JoinColumn(name = "account_id", referencedColumnName = "id")
private AccountEntity account;
@OneToOne
@ManyToOne
@JoinColumn(name = "indicator_id", referencedColumnName = "id")
private IndicatorEntity indicator;
......
package com.altimetrik.pmis.core.entity;
import com.altimetrik.pmis.core.enums.ProjectType;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
......@@ -20,6 +21,10 @@ public class IndicatorEntity {
@Column(nullable = false)
private String name;
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private ProjectType projectType;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "category_id", referencedColumnName = "id")
private CategoryEntity category;
......
......@@ -21,13 +21,16 @@ public class ProjectEntity {
@Column(length = 100)
private String name;
@OneToOne(fetch = FetchType.LAZY, optional = false)
@ManyToOne
@JoinColumn(name = "account_id", referencedColumnName = "id")
private AccountEntity account;
@Column(length = 100)
private String manager;
@Column
private String managerEmail;
@Column(length = 100)
private String clientManager;
......
package com.altimetrik.pmis.core.entity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.*;
import java.sql.Date;
import java.time.LocalDate;
import java.util.List;
@Entity
......@@ -15,20 +12,21 @@ import java.util.List;
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ProjectSummaryEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne
@ManyToOne
@JoinColumn(name = "project_id", referencedColumnName = "id")
private ProjectEntity project;
@Column
private char engineeringStatus;
@Column
private Date reportDate;
@Temporal(TemporalType.DATE)
private LocalDate reportDate;
@Column
private int planned;
......@@ -39,6 +37,6 @@ public class ProjectSummaryEntity {
@Column
private char peopleStatus;
@OneToMany(mappedBy = "projectSummary")
@OneToMany(mappedBy = "projectSummary", cascade = CascadeType.ALL)
private List<ProjectSummaryRemarkEntity> remarks;
}
package com.altimetrik.pmis.core.entity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.*;
@Entity
@Table(name = "tbl_project_summary_remark")
......@@ -12,6 +9,7 @@ import lombok.Setter;
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ProjectSummaryRemarkEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
......
......@@ -7,7 +7,6 @@ import lombok.NoArgsConstructor;
import lombok.Setter;
import java.sql.Date;
import java.util.List;
@Entity
@Table(name = "tbl_weekly_metric")
......
package com.altimetrik.pmis.core.enums;
public enum ProjectType {
DEVELOPMENT, QE
}
//package com.altimetrik.pmis.mapper;
//
//import com.altimetrik.pmis.model.Metrics;
//import org.mapstruct.Mapper;
//import org.mapstruct.factory.Mappers;
//
//@Mapper
//public interface MetricsMapper {
// MetricsMapper INSTANCE = Mappers.getMapper(MetricsMapper.class);
//
// Metrics entityToDomain(MetricsEntity metricsEntity);
//
// MetricsEntity domainToEntity(Metrics metrics);
//}
package com.altimetrik.pmis.mapper;
import com.altimetrik.pmis.core.entity.AccountEntity;
import com.altimetrik.pmis.core.entity.AccountMetricEntity;
import com.altimetrik.pmis.core.entity.IndicatorEntity;
import com.altimetrik.pmis.model.Metric;
import com.altimetrik.pmis.model.MetricIndicator;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
@Mapper
public interface MetricsMapper {
MetricsMapper INSTANCE = Mappers.getMapper(MetricsMapper.class);
default Metric entityToDomain(List<AccountMetricEntity> accountMetricEntities) {
Metric metric = null;
for (AccountMetricEntity accountMetricEntity : accountMetricEntities) {
if (Objects.isNull(metric)) {
metric = accountMetricEntityToDomain(accountMetricEntity);
}
metric.getMetricIndicators().add(mapIndicatorEntityToDomain(accountMetricEntity.getId(), accountMetricEntity.getIndicator(), accountMetricEntity.isActive()));
}
return metric;
}
default List<AccountMetricEntity> domainToEntity(Metric metric, Optional<AccountEntity> accountEntityOptional, Optional<List<IndicatorEntity>> indicatorEntitiesOptional) {
List<AccountMetricEntity> accountMetricEntities = new ArrayList<>();
if (indicatorEntitiesOptional.isPresent() && accountEntityOptional.isPresent()) {
accountMetricEntities = indicatorEntitiesOptional.get().stream()
.map((indicatorEntity) -> {
Optional<MetricIndicator> metricIndicatorOptional = metric.getMetricIndicators().stream().filter(metricIndicator -> metricIndicator.getIndicatorId().equals(indicatorEntity.getId())).findFirst();
return AccountMetricEntity.builder()
.id(null)
.description(metric.getDescription())
.account(accountEntityOptional.get())
.indicator(indicatorEntity)
.isActive(metricIndicatorOptional.isPresent() ? metricIndicatorOptional.get().isActive() : false)
.build();
})
.collect(Collectors.toList());
}
return accountMetricEntities;
}
@Mapping(target = "accountId", source = "account.id")
Metric accountMetricEntityToDomain(AccountMetricEntity accountMetricEntity);
@Mapping(target = "active", source = "isActive")
@Mapping(target = "metricId", source = "metricId")
@Mapping(target = "indicatorId", source = "indicatorEntity.id")
@Mapping(target = "indicatorName", source = "indicatorEntity.name")
MetricIndicator mapIndicatorEntityToDomain(Long metricId, IndicatorEntity indicatorEntity, boolean isActive);
}
......@@ -4,7 +4,6 @@ import com.altimetrik.pmis.core.entity.ProjectEntity;
import com.altimetrik.pmis.model.Project;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import org.springframework.util.CollectionUtils;
@Mapper
public interface ProjectMapper {
......
package com.altimetrik.pmis.mapper;
import com.altimetrik.pmis.core.entity.ProjectSummaryEntity;
import com.altimetrik.pmis.core.entity.ProjectSummaryRemarkEntity;
import com.altimetrik.pmis.model.ProjectSummary;
import com.altimetrik.pmis.model.ProjectSummaryRemark;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.List;
import java.util.stream.Collectors;
@Mapper
public interface ProjectSummaryMapper {
ProjectSummaryMapper INSTANCE = Mappers.getMapper(ProjectSummaryMapper.class);
List<ProjectSummary> projectSummaryEntitiesToDomains(List<ProjectSummaryEntity> projectSummaryEntities);
@Mapping(target = "projectId", source = "project.id")
@Mapping(target = "projectName", source = "project.name")
ProjectSummary projectSummaryEntityToDomain(ProjectSummaryEntity projectSummaryEntity);
default List<ProjectSummaryEntity> projectSummaryDomainsToEntities(List<ProjectSummary> projectSummaries) {
return projectSummaries.stream()
.map(projectSummary -> mapProjectSummaryDomainToEntity(projectSummary))
.collect(Collectors.toList());
}
default ProjectSummaryEntity mapProjectSummaryDomainToEntity(ProjectSummary projectSummary) {
ProjectSummaryEntity projectSummaryEntity = projectSummaryDomainToEntity(projectSummary);
projectSummaryEntity.setRemarks(mapProjectSummaryRemarkDomainsToEntities(projectSummary.getRemarks(), projectSummaryEntity));
return projectSummaryEntity;
}
@Mapping(target = "project.id", source = "projectId")
ProjectSummaryEntity projectSummaryDomainToEntity(ProjectSummary projectSummary);
default List<ProjectSummaryRemarkEntity> mapProjectSummaryRemarkDomainsToEntities(List<ProjectSummaryRemark> projectSummaryRemarks, ProjectSummaryEntity projectSummaryEntity) {
return projectSummaryRemarks.stream()
.map(projectSummaryRemark -> mapProjectSummaryRemarkDomainToEntity(projectSummaryRemark, projectSummaryEntity))
.collect(Collectors.toList());
}
default ProjectSummaryRemarkEntity mapProjectSummaryRemarkDomainToEntity(ProjectSummaryRemark projectSummaryRemark, ProjectSummaryEntity projectSummaryEntity) {
ProjectSummaryRemarkEntity projectSummaryRemarkEntity = projectSummaryRemarkDomainToEntity(projectSummaryRemark);
projectSummaryRemarkEntity.setProjectSummary(projectSummaryEntity);
return projectSummaryRemarkEntity;
}
ProjectSummaryRemarkEntity projectSummaryRemarkDomainToEntity(ProjectSummaryRemark projectSummaryRemark);
}
......@@ -11,6 +11,7 @@ public class Account {
private Long id;
private String name;
private String head;
private String headEmail;
private String clientPartner;
private String clientHead;
private String description;
......
package com.altimetrik.pmis.model;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
......
package com.altimetrik.pmis.model;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
......
package com.altimetrik.pmis.model;
import com.altimetrik.pmis.core.enums.CategoryType;
import jakarta.validation.constraints.NotEmpty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
......@@ -13,6 +14,9 @@ import lombok.Setter;
@AllArgsConstructor
public class Category {
private Long id;
@NotEmpty(message = "Category name cannot be null or empty")
private String categoryName;
private CategoryType type;
}
}
\ No newline at end of file
package com.altimetrik.pmis.model;
import jakarta.validation.constraints.NotEmpty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.time.LocalDate;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class CreateProjectSummaryRequest {
@NotEmpty(message = "account id cannot be null or empty")
private Long accountId;
@NotEmpty(message = "week date cannot be null or empty")
private LocalDate reportDate;
}
package com.altimetrik.pmis.model;
import com.altimetrik.pmis.core.enums.ProjectType;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
......@@ -11,6 +15,13 @@ import lombok.Setter;
@AllArgsConstructor
public class Indicator {
private Long id;
@NotEmpty(message = "Indicator name cannot be null or empty")
private String name;
@Valid
@NotNull(message = "Category cannot be null")
private Category category;
}
private ProjectType projectType;
}
\ No newline at end of file
package com.altimetrik.pmis.model;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Metric {
private Long accountId;
private List<MetricIndicator> metricIndicators = new ArrayList<>();
private String description;
}
package com.altimetrik.pmis.model;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class AccountMetric {
private Long id;
@NoArgsConstructor
public class MetricIndicator {
private Long metricId;
private Account account;
private Long indicatorId;
private List<AccountCategory> categories;
private String indicatorName;
private boolean isActive;
private String comments;
}
package com.altimetrik.pmis.model;
import com.altimetrik.pmis.core.entity.AccountEntity;
import com.altimetrik.pmis.core.entity.TrendEntity;
import com.altimetrik.pmis.core.enums.ProjectStatus;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@NoArgsConstructor
......@@ -24,6 +19,8 @@ public class Project {
private String manager;
private String managerEmail;
private String clientManager;
private String description;
......
package com.altimetrik.pmis.model;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
......
package com.altimetrik.pmis.model;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
......
package com.altimetrik.pmis.model;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
......
package com.altimetrik.pmis.model;
import lombok.*;
import java.time.LocalDate;
import java.util.List;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ProjectSummary {
private Long id;
private Long projectId;
private String projectName;
private char engineeringStatus;
private LocalDate reportDate;
private int planned;
private int actual;
private char peopleStatus;
private List<ProjectSummaryRemark> remarks;
}
package com.altimetrik.pmis.model;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class ProjectSummaryRemark {
private Long id;
private String remark;
}
package com.altimetrik.pmis.model;
import com.altimetrik.pmis.core.enums.ProjectStatus;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
......
package com.altimetrik.pmis.model.validators;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = ValueOfEnumValidator.class)
public @interface ValueOfEnum {
Class<? extends Enum<?>> enumClass();
String message() default "must be any of enum {enumClass}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
\ No newline at end of file
package com.altimetrik.pmis.model.validators;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class ValueOfEnumValidator implements ConstraintValidator<ValueOfEnum, CharSequence> {
private List<String> acceptedValues;
@Override
public void initialize(ValueOfEnum annotation) {
acceptedValues = Stream.of(annotation.enumClass().getEnumConstants())
.map(Enum::name)
.collect(Collectors.toList());
}
@Override
public boolean isValid(CharSequence value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
return acceptedValues.contains(value.toString());
}
}
\ No newline at end of file
package com.altimetrik.pmis.repository;
import com.altimetrik.pmis.core.entity.AccountMetricEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface AccountMetricsRepository extends JpaRepository<AccountMetricEntity, Long> {
List<AccountMetricEntity> findByAccountIdAndIsActive(Long accountId, boolean isActive);
}
......@@ -4,4 +4,5 @@ import com.altimetrik.pmis.core.entity.AccountEntity;
import org.springframework.data.jpa.repository.JpaRepository;
public interface AccountRepository extends JpaRepository<AccountEntity, Long> {
}
......@@ -2,11 +2,15 @@ package com.altimetrik.pmis.repository;
import com.altimetrik.pmis.core.entity.IndicatorEntity;
import com.altimetrik.pmis.core.enums.CategoryType;
import com.altimetrik.pmis.core.enums.ProjectType;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
import java.util.Optional;
public interface IndicatorsRepository extends JpaRepository<IndicatorEntity, Long> {
Optional<IndicatorEntity> findByNameAndCategoryCategoryNameAndCategoryType(String name, String categoryName, CategoryType categoryType);
Optional<IndicatorEntity> findByNameAndProjectTypeAndCategoryCategoryNameAndCategoryType(String name, ProjectType projectType, String categoryName, CategoryType categoryType);
Optional<List<IndicatorEntity>> findByIdIn(List<Long> indicatorIds);
}
//package com.altimetrik.pmis.repository;
//
//import org.springframework.data.jpa.repository.JpaRepository;
//
//public interface MetricsRepository extends JpaRepository<MetricsEntity, Long> {
//}
package com.altimetrik.pmis.repository;
import com.altimetrik.pmis.core.entity.ProjectSummaryEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
public interface ProjectSummaryRepository extends JpaRepository<ProjectSummaryEntity, Long> {
Optional<List<ProjectSummaryEntity>> findByProjectAccountIdAndReportDate(Long accountId, LocalDate reportDate);
}
//package com.altimetrik.pmis.service;
//
//public interface MetricsService {
// Metrics save(Metrics metrics);
//}
package com.altimetrik.pmis.service;
import com.altimetrik.pmis.model.Metric;
public interface MetricsService {
Metric save(Metric metric);
Metric getByAccountId(Long accountId);
}
package com.altimetrik.pmis.service;
import com.altimetrik.pmis.model.CreateProjectSummaryRequest;
import com.altimetrik.pmis.model.Project;
import com.altimetrik.pmis.model.ProjectSummary;
import java.time.LocalDate;
import java.util.List;
public interface ProjectService {
......@@ -10,4 +13,10 @@ public interface ProjectService {
Project get(Long id);
List<Project> getByAccount(Long accountId);
List<ProjectSummary> createProjectSummary(CreateProjectSummaryRequest createProjectSummaryRequest);
List<ProjectSummary> getProjectSummaryByAccountIdAndReportDate(Long accountId, LocalDate reportDate);
ProjectSummary updateProjectSummary(ProjectSummary projectSummary);
}
......@@ -31,7 +31,8 @@ public class IndicatorServiceImpl implements IndicatorService {
@Override
@Transactional
public Indicator save(Indicator indicator) {
Optional<IndicatorEntity> indicatorEntityOptional = indicatorsRepository.findByNameAndCategoryCategoryNameAndCategoryType(indicator.getName(), indicator.getCategory().getCategoryName(), indicator.getCategory().getType());
Optional<IndicatorEntity> indicatorEntityOptional = indicatorsRepository.findByNameAndProjectTypeAndCategoryCategoryNameAndCategoryType(indicator.getName(), indicator.getProjectType(),
indicator.getCategory().getCategoryName(), indicator.getCategory().getType());
if (indicatorEntityOptional.isPresent()) {
return indicatorMapper.entityToDomain(indicatorEntityOptional.get());
}
......
//package com.altimetrik.pmis.service.impl;
//
//import com.altimetrik.pmis.mapper.MetricsMapper;
//import com.altimetrik.pmis.model.Metrics;
//import com.altimetrik.pmis.repository.MetricsRepository;
//import com.altimetrik.pmis.service.MetricsService;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//
//@Service
//public class MetricsServiceImpl implements MetricsService {
// private final MetricsRepository metricsRepository;
// private final MetricsMapper metricsMapper;
//
// @Autowired
// public MetricsServiceImpl(MetricsRepository metricsRepository) {
// this.metricsRepository = metricsRepository;
// this.metricsMapper = MetricsMapper.INSTANCE;
// }
//
//
// @Override
// public Metrics save(Metrics metrics) {
// return metricsMapper.entityToDomain(metricsRepository.saveAndFlush(metricsMapper.domainToEntity(metrics)));
// }
//}
package com.altimetrik.pmis.service.impl;
import com.altimetrik.pmis.core.entity.AccountEntity;
import com.altimetrik.pmis.core.entity.AccountMetricEntity;
import com.altimetrik.pmis.core.entity.IndicatorEntity;
import com.altimetrik.pmis.mapper.MetricsMapper;
import com.altimetrik.pmis.model.Metric;
import com.altimetrik.pmis.model.MetricIndicator;
import com.altimetrik.pmis.repository.AccountMetricsRepository;
import com.altimetrik.pmis.repository.AccountRepository;
import com.altimetrik.pmis.repository.IndicatorsRepository;
import com.altimetrik.pmis.service.MetricsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@Service
public class MetricsServiceImpl implements MetricsService {
private final AccountMetricsRepository accountMetricsRepository;
private final MetricsMapper metricsMapper;
private final AccountRepository accountRepository;
private final IndicatorsRepository indicatorsRepository;
@Autowired
public MetricsServiceImpl(AccountMetricsRepository metricsRepository, AccountRepository accountRepository, IndicatorsRepository indicatorsRepository) {
this.accountMetricsRepository = metricsRepository;
this.accountRepository = accountRepository;
this.indicatorsRepository = indicatorsRepository;
this.metricsMapper = MetricsMapper.INSTANCE;
}
@Override
public Metric save(Metric metric) {
if (Objects.isNull(metric) || CollectionUtils.isEmpty(metric.getMetricIndicators())) {
return null;
}
Optional<AccountEntity> accountEntityOptional = accountRepository.findById(metric.getAccountId());
Optional<List<IndicatorEntity>> indicatorEntitiesOptional = indicatorsRepository.findByIdIn(metric.getMetricIndicators().stream().map(MetricIndicator::getIndicatorId).toList());
return metricsMapper.entityToDomain(accountMetricsRepository.saveAllAndFlush(metricsMapper.domainToEntity(metric, accountEntityOptional, indicatorEntitiesOptional)));
}
@Override
public Metric getByAccountId(Long accountId) {
List<AccountMetricEntity> accountMetricEntities = accountMetricsRepository.findByAccountIdAndIsActive(accountId, true);
return metricsMapper.entityToDomain(accountMetricEntities);
}
}
package com.altimetrik.pmis.service.impl;
import com.altimetrik.pmis.core.entity.ProjectEntity;
import com.altimetrik.pmis.core.entity.ProjectSummaryEntity;
import com.altimetrik.pmis.mapper.ProjectMapper;
import com.altimetrik.pmis.mapper.ProjectSummaryMapper;
import com.altimetrik.pmis.model.CreateProjectSummaryRequest;
import com.altimetrik.pmis.model.Project;
import com.altimetrik.pmis.model.ProjectSummary;
import com.altimetrik.pmis.repository.ProjectRepository;
import com.altimetrik.pmis.repository.ProjectSummaryRepository;
import com.altimetrik.pmis.service.AccountService;
import com.altimetrik.pmis.service.ProjectService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@Service
public class ProjectServiceImpl implements ProjectService {
......@@ -19,10 +27,16 @@ public class ProjectServiceImpl implements ProjectService {
private final AccountService accountService;
private final ProjectMapper projectMapper;
private final ProjectSummaryRepository projectSummaryRepository;
private final ProjectSummaryMapper projectSummaryMapper;
@Autowired
public ProjectServiceImpl(ProjectRepository projectRepository, AccountService accountService) {
public ProjectServiceImpl(ProjectRepository projectRepository, AccountService accountService, ProjectSummaryRepository projectSummaryRepository) {
this.projectRepository = projectRepository;
this.accountService = accountService;
this.projectSummaryRepository = projectSummaryRepository;
this.projectSummaryMapper = ProjectSummaryMapper.INSTANCE;
this.projectMapper = ProjectMapper.INSTANCE;
}
......@@ -45,4 +59,31 @@ public class ProjectServiceImpl implements ProjectService {
public List<Project> getByAccount(Long accountId) {
return projectRepository.findByAccountId(accountId).stream().map(projectEntity -> projectMapper.entityToDomain(projectEntity)).toList();
}
@Override
public List<ProjectSummary> createProjectSummary(CreateProjectSummaryRequest createProjectSummaryRequest) {
Optional<List<ProjectSummaryEntity>> projectSummaryEntitiesOptional = projectSummaryRepository.findByProjectAccountIdAndReportDate(createProjectSummaryRequest.getAccountId(), createProjectSummaryRequest.getReportDate());
if (projectSummaryEntitiesOptional.isPresent() && !CollectionUtils.isEmpty(projectSummaryEntitiesOptional.get())) {
return projectSummaryMapper.projectSummaryEntitiesToDomains(projectSummaryEntitiesOptional.get());
}
List<ProjectEntity> projectEntities = projectRepository.findByAccountId(createProjectSummaryRequest.getAccountId());
List<ProjectSummaryEntity> projectSummaryEntities = projectEntities.stream().map(projectEntity -> {
return ProjectSummaryEntity.builder().project(projectEntity).reportDate(createProjectSummaryRequest.getReportDate()).build();
}).collect(Collectors.toList());
return projectSummaryMapper.projectSummaryEntitiesToDomains(projectSummaryRepository.saveAllAndFlush(projectSummaryEntities));
}
@Override
public List<ProjectSummary> getProjectSummaryByAccountIdAndReportDate(Long accountId, LocalDate reportDate) {
Optional<List<ProjectSummaryEntity>> projectSummaryEntitiesOptional = projectSummaryRepository.findByProjectAccountIdAndReportDate(accountId, reportDate);
return projectSummaryEntitiesOptional.isPresent() ? projectSummaryMapper.projectSummaryEntitiesToDomains(projectSummaryEntitiesOptional.get()) : new ArrayList<>();
}
@Override
public ProjectSummary updateProjectSummary(ProjectSummary projectSummary) {
return projectSummaryMapper.projectSummaryEntityToDomain(projectSummaryRepository.saveAndFlush(projectSummaryMapper.mapProjectSummaryDomainToEntity(projectSummary)));
}
}
package com.altimetrik;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment