Skip to content
Snippets Groups Projects
Commit a052979f authored by Anesa Fazlagić's avatar Anesa Fazlagić
Browse files

finished database for electricity prices

parent c28c5ffb
No related branches found
No related tags found
3 merge requests!79Final merge to main,!43Testing user,!36Electricity tarif microservice hibernate add
Pipeline #
Showing
with 159 additions and 129 deletions
......@@ -26,6 +26,24 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.5.4</version>
</dependency>
</dependencies>
<modelVersion>4.0.0</modelVersion>
......
......@@ -13,12 +13,11 @@ import java.io.Serializable;
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "electricity_price")
@Table(name = "electricityprices")
public class ElectricityPrice implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "electricity_price_id")
private String id;
private Long id;
@Override
public String toString() {
......@@ -31,7 +30,7 @@ public class ElectricityPrice implements Serializable {
}
@Column
private String companyId;
private Long companyId;
@Column
private double priceHighTariff;
......
package cz.muni.fi.pa165.microservice4.electricityprices;
import cz.muni.fi.pa165.microservice4.electricityprices.dtos.ElectricityPriceGetFullDto;
import cz.muni.fi.pa165.microservice4.electricityprices.dtos.ElectricityPricePostDto;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RestController;
......@@ -23,7 +28,7 @@ import java.util.List;
@Slf4j
@RestController
@RequestMapping(value = "/api/v1/electricity", produces = MediaType.APPLICATION_JSON_VALUE)
@RequestMapping(value = "/api/electricityprices", produces = MediaType.APPLICATION_JSON_VALUE)
public class ElectricityPriceController {
private final ElectricityPriceServiceImpl electricityPriceService;
......@@ -57,8 +62,8 @@ public class ElectricityPriceController {
schema = @Schema(implementation = ElectricityPrice.class))
})
})
@GetMapping(path = "/electricityprices")
public List<ElectricityPrice> getAllElectricityPrice() {
@GetMapping
public List<ElectricityPriceGetFullDto> getAllElectricityPrice() {
return electricityPriceService.getAllElectricityPrice();
}
......@@ -84,14 +89,15 @@ public class ElectricityPriceController {
description = "Invalid or non-exsisting company id supplied",
content = @Content)
})
@GetMapping(value = "/electricityprices/{companyId}")
public double getElectricityPrice(@PathVariable("companyId") String companyId) {
@GetMapping(path = "/{companyId}")
public double getElectricityPrice(@PathVariable("companyId") Long companyId) {
return electricityPriceService.getElectricityPrice(companyId);
}
@Operation(
summary = "Set electricity price for the company",
description = "Changes an electricity price for the provided company id in URL." +
description = "Adds/Changes an electricity price for the provided company id" +
"request body contains the companyId, priceHighTariff, priceLowTariff" +
"Returns an electricity price object from the database after commiting the change." +
"In case company id not being found, new electricity price object is entered in the database." +
"Returns an electricity price for the newly created object.",
......@@ -100,15 +106,14 @@ public class ElectricityPriceController {
value = {
@ApiResponse(
responseCode = "200",
description = "Updated electricity price of a company",
description = "Added/Updated electricity price of a company",
content = {
@Content(mediaType = "application/json",
schema = @Schema(implementation = ElectricityPrice.class))
})
})
@PostMapping(path = "/electricityprices")
public ElectricityPrice setElectricityPrice(@RequestBody ElectricityPriceSetRequest req) {
log.info("new price adding {}", req);
@PostMapping
public ElectricityPrice setElectricityPrice(@Valid @RequestBody ElectricityPricePostDto req) {
return electricityPriceService.setElectricityPrice(req);
}
......@@ -116,7 +121,7 @@ public class ElectricityPriceController {
summary = "Delete electricity price for the company",
description = "Searches an electricity price by provided company id in URL." +
"Deletes an electricity price object from the database if found." +
"Otherwise, throws an exception.",
"Otherwise, returns a message about the error.",
tags = "{electricity price}")
@ApiResponses(
value = {
......@@ -131,9 +136,29 @@ public class ElectricityPriceController {
description = "Invalid or non-exsisting company id supplied",
content = @Content)
})
@DeleteMapping(path = "/electricityprices/{companyId}")
public String deleteElectricityPriceForCompany(@PathVariable("companyId") String companyId) {
@DeleteMapping(path = "/{companyId}")
public String deleteElectricityPriceForCompany(@PathVariable("companyId") Long companyId) {
return electricityPriceService.deleteElectricityPriceForCompany(companyId);
}
@Operation(
summary = "Get all electricity prices for all companies per page",
description = "Returns a list of all exsisting electricity price objects per page from the database." +
"In case there are none, it returns an empty list.",
tags = "{electricity price}")
@ApiResponses(
value = {
@ApiResponse(
responseCode = "200",
description = "Found all electricity prices",
content = {
@Content(
mediaType = "application/json",
schema = @Schema(implementation = ElectricityPrice.class))
})
})
@GetMapping("/page")
public Page<ElectricityPriceGetFullDto> getAllElectricityPricePagable(Pageable pageable) {
return electricityPriceService.getAllElectricityPricePagable(pageable);
}
}
package cz.muni.fi.pa165.microservice4.electricityprices;
import cz.muni.fi.pa165.microservice4.electricityprices.dtos.ElectricityPriceGetFullDto;
import cz.muni.fi.pa165.microservice4.electricityprices.dtos.ElectricityPriceHighTariffDto;
import cz.muni.fi.pa165.microservice4.electricityprices.dtos.ElectricityPriceLowTariffDto;
import cz.muni.fi.pa165.microservice4.electricityprices.dtos.ElectricityPricePostDto;
import org.mapstruct.BeforeMapping;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import java.util.List;
@Mapper(componentModel = "spring")
public interface ElectricityPriceMapper {
@Mapping(target = "price", source = "electricityPrice.priceLowTariff")
List<ElectricityPriceLowTariffDto> electricityPriceToElectricityPriceLowTariffDto(List<ElectricityPrice> electricityPrice);
public abstract class ElectricityPriceMapper {
@BeforeMapping()
void addId() {
@Mapping(target = "price", source = "electricityPrice.priceHighTariff")
List<ElectricityPriceHighTariffDto> electricityPriceToElectricityPriceHighTariffDto(List<ElectricityPrice> electricityPrice);
}
List<ElectricityPriceGetFullDto> electricityPriceListToElectricityPriceGetFullDtoList(List<ElectricityPrice> electricityPriceList);
abstract List<ElectricityPriceGetFullDto> electricityPriceListToElectricityPriceGetFullDtoList(List<ElectricityPrice> electricityPriceList);
ElectricityPrice electricityPricePostDtoToElectricityPrice(ElectricityPricePostDto electricityPricePostDto);
abstract ElectricityPrice electricityPricePostDtoToElectricityPrice(ElectricityPricePostDto electricityPricePostDto);
ElectricityPriceGetFullDto electricityPriceToElectricityPriceGetFullDto(ElectricityPrice electricityPrice);
abstract ElectricityPriceGetFullDto electricityPriceToElectricityPriceGetFullDto(ElectricityPrice electricityPrice);
@Mapping(target = "price", source = "electricityPrice.priceLowTariff")
ElectricityPriceLowTariffDto electricityPriceToElectricityPriceLowTariffDto(ElectricityPrice electricityPrice);
@Mapping(target = "price", source = "electricityPrice.priceHighTariff")
ElectricityPriceHighTariffDto electricityPriceToElectricityPriceHighTariffDto(ElectricityPrice electricityPrice);
Page<ElectricityPriceGetFullDto> mapToPageDto(Page<ElectricityPrice> prices) {
return new PageImpl<>(electricityPriceListToElectricityPriceGetFullDtoList(prices.getContent()), prices.getPageable(), prices.getTotalPages());
}
}
package cz.muni.fi.pa165.microservice4.electricityprices;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
@Repository
public interface ElectricityPriceRepository extends JpaRepository<ElectricityPrice, String> {
ElectricityPrice findByCompanyId(String companyId);
public interface ElectricityPriceRepository extends JpaRepository<ElectricityPrice, Long> {
ElectricityPrice findByCompanyId(Long companyId);
@Modifying
@Query(value = "DELETE FROM electricityprices WHERE company_id = ?1", nativeQuery = true)
void deleteCompany(Long companyId);
}
package cz.muni.fi.pa165.microservice4.electricityprices;
import cz.muni.fi.pa165.microservice4.electricityprices.dtos.ElectricityPriceGetFullDto;
import cz.muni.fi.pa165.microservice4.electricityprices.dtos.ElectricityPricePostDto;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import java.util.List;
public interface ElectricityPriceService {
ElectricityPriceGetFullDto getElectricityPriceObj(Long companyId);
double getElectricityPrice(Long companyId); // dependent on time - low or high tariff
double getElectricityPrice(String companyId); // dependent on time - low or high tariff
Page<ElectricityPriceGetFullDto> getAllElectricityPricePagable(Pageable pages);
Page<ElectricityPrice> getAllElectricityPricePagable(Pageable pages);
List<ElectricityPriceGetFullDto> getAllElectricityPrice();
List<ElectricityPrice> getAllElectricityPrice();
String deleteElectricityPriceForCompany(Long companyId);
ElectricityPrice setElectricityPrice(ElectricityPriceSetRequest req);
String deleteElectricityPriceForCompany(String companyId);
ElectricityPrice setElectricityPrice(ElectricityPricePostDto req);
}
package cz.muni.fi.pa165.microservice4.electricityprices;
import cz.muni.fi.pa165.microservice4.electricityprices.dtos.ElectricityPriceLowTariffDto;
import cz.muni.fi.pa165.microservice4.electricityprices.dtos.ElectricityPriceGetFullDto;
import cz.muni.fi.pa165.microservice4.electricityprices.dtos.ElectricityPricePostDto;
import jakarta.annotation.PostConstruct;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
......@@ -12,42 +13,43 @@ import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArrayList;
@Service
public class ElectricityPriceServiceImpl implements ElectricityPriceService {
private final ElectricityPriceRepository electricityPriceRepository;
private final ElectricityPriceMapper mapStructMapper;
public ElectricityPriceServiceImpl(ElectricityPriceRepository electricityPriceRepository, ElectricityPriceMapper mapStructMapper) {
this.electricityPriceRepository = electricityPriceRepository;
this.mapStructMapper = mapStructMapper;
}
private final ElectricityPriceMapper mapStructMapper;
private final List<ElectricityPrice> list = new CopyOnWriteArrayList<>();
@PostConstruct
public void init() {
list.add(
electricityPriceRepository.save(
ElectricityPrice.builder()
.id("1")
.companyId("1")
.priceHighTariff(300.0)
.priceLowTariff(200.0)
.companyId(1L)
.priceHighTariff(399.0)
.priceLowTariff(299.0)
.build());
}
@Override
@Transactional(readOnly = true)
public double getElectricityPrice(String companyId) {
ElectricityPrice electricityPrice = Optional.of(electricityPriceRepository.findByCompanyId(companyId)).orElseThrow(() -> new NoElectricityPriceForCompanyException("No electricity price information for that company."));
ElectricityPriceLowTariffDto electricityPriceLowTariffDto = new ElectricityPriceLowTariffDto();
electricityPriceLowTariffDto.setPrice(getPriceAcordingToDate(electricityPrice));
return 0;
public double getElectricityPrice(Long companyId) {
ElectricityPrice electricityPrice = electricityPriceRepository.findByCompanyId(companyId);
if (electricityPrice == null) {
System.out.println("OKKK");
throw new RuntimeException("No electricity price information for that company.");
}
return getPriceAcordingToDate(electricityPrice);
}
@Override
@Transactional(readOnly = true)
public ElectricityPriceGetFullDto getElectricityPriceObj(Long companyId) {
return mapStructMapper.electricityPriceToElectricityPriceGetFullDto(electricityPriceRepository.findByCompanyId(companyId));
}
private double getPriceAcordingToDate(ElectricityPrice price) {
......@@ -64,41 +66,33 @@ public class ElectricityPriceServiceImpl implements ElectricityPriceService {
@Override
@Transactional(readOnly = true)
public List<ElectricityPrice> getAllElectricityPrice() {
return electricityPriceRepository.findAll();
public List<ElectricityPriceGetFullDto> getAllElectricityPrice() {
return mapStructMapper.electricityPriceListToElectricityPriceGetFullDtoList(electricityPriceRepository.findAll());
}
@Override
@Transactional(readOnly = true)
public Page<ElectricityPrice> getAllElectricityPricePagable(Pageable pages) {
return electricityPriceRepository.findAll(pages);
public Page<ElectricityPriceGetFullDto> getAllElectricityPricePagable(Pageable pageable) {
return mapStructMapper.mapToPageDto(electricityPriceRepository.findAll(pageable));
}
public ElectricityPrice setElectricityPrice(ElectricityPriceSetRequest req) {
for (ElectricityPrice price:
list) {
if(Objects.equals(price.getCompanyId(), req.getCompanyId())) {
price.setPriceLowTariff(req.getPriceLowTariff());
price.setPriceHighTariff(req.getPriceHighTariff());
return price;
}
}
ElectricityPrice newPrice = new ElectricityPrice(UUID.randomUUID().toString(), req.getCompanyId(), req.getPriceHighTariff(), req.getPriceLowTariff());
list.add(newPrice);
return newPrice;
@Override
@Transactional
public String deleteElectricityPriceForCompany(Long companyId) {
return Optional.ofNullable(electricityPriceRepository.findByCompanyId(companyId))
.map(electricityPrice -> {
electricityPriceRepository.deleteCompany(companyId);
return "Deleted electricity price for a company.";
})
.orElse("Did not delete the electricity prices - company not found.");
}
@Override
@ExceptionHandler
public String deleteElectricityPriceForCompany(String companyId) {
for (ElectricityPrice price:
list) {
if(Objects.equals(price.getCompanyId(), companyId)) {
list.remove(price);
return "deleted electricity prices for company with companyId " + companyId;
}
}
throw new NoElectricityPriceForCompanyException("Did not delete the electricity prices - company not found.");
@Transactional
public ElectricityPrice setElectricityPrice(ElectricityPricePostDto req) {
Optional.ofNullable(electricityPriceRepository.findByCompanyId(req.getCompanyId()))
.ifPresent(electricityPriceRepository::delete);
return electricityPriceRepository.save(mapStructMapper.electricityPricePostDtoToElectricityPrice(req));
}
......
package cz.muni.fi.pa165.microservice4.electricityprices;
import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
@Builder
@Data
public class ElectricityPriceSetRequest {
private String companyId;
private double priceHighTariff;
private double priceLowTariff;
}
package cz.muni.fi.pa165.microservice4.electricityprices.dtos;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class ElectricityPriceGetFullDto {
private String id;
private Long id;
private String companyId;
private Long companyId;
private double priceHighTariff;
......
......@@ -5,19 +5,10 @@ import lombok.Setter;
@Getter
@Setter
public class ElectricityPriceLowTariffDto {
private String id;
public class ElectricityPriceGetSlimDto {
private Long id;
private String companyId;
private double price;
@Override
public String toString() {
return "ElectricityPriceGetSlimDto{" +
"id='" + id + '\'' +
", companyId='" + companyId + '\'' +
", price=" + price +
'}';
}
}
package cz.muni.fi.pa165.microservice4.electricityprices.dtos;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class ElectricityPriceHighTariffDto {
private String id;
private String companyId;
private double price;
@Override
public String toString() {
return "ElectricityPriceGetSlimDto{" +
"id='" + id + '\'' +
", companyId='" + companyId + '\'' +
", price=" + price +
'}';
}
}
\ No newline at end of file
......@@ -9,12 +9,9 @@ import lombok.Setter;
@Setter
public class ElectricityPricePostDto {
@JsonProperty("id")
private int id;
@NotNull
@JsonProperty("companyId")
private String companyId;
private Long companyId;
@NotNull
@JsonProperty("priceHighTariff")
......
#spring.h2.console.enabled=true
#spring.jpa.properties.hibernate.globally_quoted_identifiers=true
spring.jpa.hibernate.ddl-auto=create
spring.jpa.open-in-view=false
spring.datasource.url=jdbc:h2:mem:electricity-prices;MODE=PostgreSQL
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.show-sql=true
spring.cache.type=NONE
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment