Skip to content
Snippets Groups Projects
Commit 8bd5f25d authored by Filip Bugoš's avatar Filip Bugoš
Browse files

Merge branch 'M2_roles_statistics' into 'milestone-2'

Roles, statistics

See merge request !26
parents 50cc3176 dc92fcaf
No related branches found
No related tags found
2 merge requests!30Rename microservice4, fix dockerfiles,!26Roles, statistics
Pipeline #
Showing
with 259 additions and 122 deletions
......@@ -11,6 +11,10 @@ import cz.muni.fi.pa165.core.smartmeter.SmartMeterService;
import cz.muni.fi.pa165.core.user.User;
import cz.muni.fi.pa165.core.user.UserService;
import cz.muni.fi.pa165.core.user.UserType;
import cz.muni.fi.pa165.core.user.roles.HouseRole;
import cz.muni.fi.pa165.core.user.roles.RoleService;
import cz.muni.fi.pa165.model.dto.role.enums.HouseRoleEnum;
import cz.muni.fi.pa165.model.dto.role.enums.RoleTypeEnum;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
......@@ -28,6 +32,7 @@ public class DataInitializer implements ApplicationRunner {
private final SmartMeterService smartMeterService;
private final MetricsService metricsService;
private final HouseService houseService;
private final RoleService roleService;
@Override
public void run(ApplicationArguments args) throws Exception {
......@@ -35,6 +40,7 @@ public class DataInitializer implements ApplicationRunner {
SeedDevice();
SeedSmartMeter();
SeedMetrics();
SeedOwnerRole();
}
private void SeedUsers() {
......@@ -75,6 +81,12 @@ public class DataInitializer implements ApplicationRunner {
.build();
userService.create(user);
HouseRole role = HouseRole.builder()
.houseRole(HouseRoleEnum.Owner)
.build();
role.setUser(user);
roleService.create(role);
Device device = Device.builder().name("device03").build();
deviceService.create(device);
......@@ -83,13 +95,15 @@ public class DataInitializer implements ApplicationRunner {
List<SmartMeter> smartMeterList = new ArrayList<SmartMeter>();
smartMeterList.add(smartMeter);
ArrayList<HouseRole> owners = new ArrayList<>();
owners.add(role);
House house = House.builder()
.smartMeterList(smartMeterList)
.address("lol")
.city("lol")
.state("lol")
.zipcode("lol")
.user(user)
.ownerList(owners)
.build();
houseService.create(house);
......@@ -104,4 +118,35 @@ public class DataInitializer implements ApplicationRunner {
}
private void SeedOwnerRole()
{
User user =
User.builder()
.email("test@email.com")
.firstName("John")
.lastName("Doe")
.username("johnD")
.password("password")
.userType(UserType.ADMIN)
.build();
user.setId("6a9f853d-59ef-4636-9c0b-bbac44bfd7f4");
userService.create(user);
House house = House.builder()
.address("lol")
.city("lol")
.state("lol")
.zipcode("lol")
.build();
house.setId("6aac9569-2d34-4aba-971b-57248fc34c80");
houseService.create(house);
HouseRole role = HouseRole.builder()
.house(house)
.build();
role.setUser(user);
role.setRoleType(RoleTypeEnum.HouseRole);
roleService.create(role);
}
}
package cz.muni.fi.pa165.core.company;
import cz.muni.fi.pa165.core.common.DomainObject;
import cz.muni.fi.pa165.core.user.roles.CompanyRole;
import jakarta.persistence.Entity;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Builder;
......@@ -9,6 +11,8 @@ import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@Entity
......@@ -18,4 +22,6 @@ import lombok.Setter;
@Table(name = "domain_company")
public class Company extends DomainObject {
private String name;
@OneToMany
private List<CompanyRole> employeeList;
}
......@@ -2,11 +2,8 @@ package cz.muni.fi.pa165.core.house;
import cz.muni.fi.pa165.core.common.DomainObject;
import cz.muni.fi.pa165.core.smartmeter.SmartMeter;
import cz.muni.fi.pa165.core.user.User;
import jakarta.persistence.Entity;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import cz.muni.fi.pa165.core.user.roles.HouseRole;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
......@@ -32,6 +29,6 @@ public class House extends DomainObject {
@OneToMany
private List<SmartMeter> smartMeterList;
@ManyToOne
private User user;
@OneToMany
private List<HouseRole> ownerList;
}
......@@ -2,6 +2,7 @@ package cz.muni.fi.pa165.core.user;
import cz.muni.fi.pa165.core.common.DomainObject;
import cz.muni.fi.pa165.core.house.House;
import cz.muni.fi.pa165.core.user.roles.Role;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
......@@ -38,5 +39,5 @@ public class User extends DomainObject {
private String lastName;
@OneToMany
private List<House> housesList;
private List<Role> rolesList;
}
......@@ -140,9 +140,9 @@ public class UserController {
@ApiResponse(responseCode = "200", description = "Success"),
@ApiResponse(responseCode = "404", description = "User not found"),
})
public List<Double> userHouseStatistics(
public Double userHouseStatistics(
@RequestBody UserStatisticsCreateDto createStatDto) {
return userService.getConsumption(createStatDto.getId(), createStatDto.getHouseId(),
return userService.getConsumption(createStatDto.getUserId(), createStatDto.getHouseId(),
createStatDto.getStartTime(), createStatDto.getEndTime());
}
......
......@@ -18,14 +18,15 @@ public interface UserRepository extends JpaRepository<User, String> {
int update(@Param("user") User user, @Param("id") String id);
@Query("Select m.consumptionKWH " +
@Query("Select SUM(m.consumptionKWH) " +
"From User u " +
"INNER JOIN HouseRole hr " +
"INNER JOIN House h " +
"INNER JOIN SmartMeter s " +
"INNER JOIN Metrics m " +
"where u.id = :#{#userId} and h.id = :#{#houseId} and m.timeStamp >= :#{#startTime} and m.timeStamp <= :#{#endTime}")
List<Double> getStatisticsData(@Param("userId") String userId,
Double getStatisticsData(@Param("userId") String userId,
@Param("houseId") String houseId,
@Param("startTime") LocalDateTime startTime,
@Param("startTime") LocalDateTime endTime);
@Param("endTime") LocalDateTime endTime);
}
......@@ -30,7 +30,7 @@ public class UserService extends DomainService<User> {
}
@Transactional(readOnly = true)
public List<Double> getConsumption(String userId,
public Double getConsumption(String userId,
String houseId,
LocalDateTime startTime,
LocalDateTime endTime) {
......
package cz.muni.fi.pa165.core.user.roles;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.*;
@Getter
@Setter
@Entity
@Builder
@NoArgsConstructor
@Table(name = "domain_admin")
public class AdminRole extends Role{
}
package cz.muni.fi.pa165.core.user.roles;
import cz.muni.fi.pa165.core.company.Company;
import cz.muni.fi.pa165.model.dto.role.enums.CompanyRoleEnum;
import jakarta.persistence.Entity;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
......@@ -12,8 +13,9 @@ import lombok.*;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "domain_employee")
public class EmployeeRole extends Role{
@Table(name = "domain_companyRole")
public class CompanyRole extends Role{
@ManyToOne
public Company company;
private Company company;
private CompanyRoleEnum companyRoleEnum;
}
package cz.muni.fi.pa165.core.user.roles;
import cz.muni.fi.pa165.core.house.House;
import jakarta.persistence.Entity;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import cz.muni.fi.pa165.model.dto.role.enums.HouseRoleEnum;
import jakarta.persistence.*;
import lombok.*;
@Getter
......@@ -12,8 +11,11 @@ import lombok.*;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "domain_owner")
public class OwnerRole extends Role{
@Table(name = "domain_houseRoles")
public class HouseRole extends Role {
@ManyToOne
public House house;
private House house;
private HouseRoleEnum houseRole;
}
......@@ -2,30 +2,22 @@ package cz.muni.fi.pa165.core.user.roles;
import cz.muni.fi.pa165.core.common.DomainObject;
import cz.muni.fi.pa165.core.user.User;
import cz.muni.fi.pa165.model.dto.user.UserCreateDto;
import cz.muni.fi.pa165.model.dto.user.UserDto;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
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.persistence.Entity;
import jakarta.persistence.Inheritance;
import jakarta.persistence.InheritanceType;
import jakarta.persistence.ManyToOne;
import cz.muni.fi.pa165.model.dto.role.enums.RoleTypeEnum;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@Getter
@Setter
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Role extends DomainObject {
public class Role extends DomainObject {
@ManyToOne
public User user;
private RoleTypeEnum roleType;
@JoinColumn(name= "owner_id")
protected User user;
protected RoleTypeEnum roleType;
}
package cz.muni.fi.pa165.core.user.roles;
import cz.muni.fi.pa165.model.dto.common.Result;
import cz.muni.fi.pa165.model.dto.role.CompanyRoleDto;
import cz.muni.fi.pa165.model.dto.role.HouseRoleDto;
import cz.muni.fi.pa165.model.dto.role.RoleDto;
import cz.muni.fi.pa165.model.dto.user.UserCreateDto;
import cz.muni.fi.pa165.model.dto.user.UserDto;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
......@@ -11,23 +12,24 @@ 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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.swing.*;
import java.util.List;
@RestController
@RequestMapping("/api/role")
public class RoleController {
private final RoleService roleService;
private final RoleService roleService;
private final RoleFacade roleFacade;
@Autowired
public RoleController(RoleService roleService){
public RoleController(RoleService roleService, RoleFacade roleFacade){
this.roleService = roleService;
this.roleFacade = roleFacade;
}
@Operation(
summary = "Create role for user",
summary = "Create house role",
description = "Creates a new user roles",
tags = {"role"})
@ApiResponses(
......@@ -42,43 +44,68 @@ public class RoleController {
}),
@ApiResponse(responseCode = "400", description = "Invalid input", content = @Content),
})
@PostMapping
public Role create(
@Parameter(description = "Role to be created") @RequestBody Role roleDto) {
return roleService.create(roleDto);
@PostMapping("/house-role")
public HouseRoleDto createHouseRole(
@Parameter(description = "Role to be created") @RequestBody HouseRoleDto roleDto) {
return roleFacade.createHouseRole(roleDto);
}
@DeleteMapping("/{id}")
@Operation(summary = "Delete a user role")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "Role deleted successfully"),
@ApiResponse(responseCode = "404", description = "Role not found"),
@ApiResponse(responseCode = "500", description = "Internal server error")
})
public Role deleteById(
@Parameter(description = "ID of the role to be deleted") @PathVariable String id) {
return roleService.deleteById(id);
@Operation(
summary = "Create company role",
description = "Creates a new user roles",
tags = {"role"})
@ApiResponses(
value = {
@ApiResponse(
responseCode = "201",
description = "Role created",
content = {
@Content(
mediaType = "application/json",
schema = @Schema(implementation = UserDto.class))
}),
@ApiResponse(responseCode = "400", description = "Invalid input", content = @Content),
})
@PostMapping("/company-role")
public CompanyRoleDto createCompanyRole(
@Parameter(description = "Role to be created") @RequestBody CompanyRoleDto roleDto) {
return roleFacade.createCompanyRole(roleDto);
//return new CompanyRole();
}
@Operation(
summary = "Get all user roles",
description = "Returns all user roles",
summary = "Create general role",
description = "Creates a new user roles",
tags = {"role"})
@ApiResponses(
value = {
@ApiResponse(
responseCode = "200",
description = "Roles found",
responseCode = "201",
description = "Role created",
content = {
@Content(
mediaType = "application/json",
schema = @Schema(implementation = Result.class))
})
schema = @Schema(implementation = UserDto.class))
}),
@ApiResponse(responseCode = "400", description = "Invalid input", content = @Content),
})
@GetMapping
public List<Role> findUserRoles(
@Parameter(description = "Page number of results to retrieve") @RequestParam String userId) {
return roleService.findAllByUser(userId);
@PostMapping("/general-role")
public RoleDto createGeneralRole(
@Parameter(description = "Role to be created") @RequestBody RoleDto roleDto) {
return roleFacade.createGeneralRole(roleDto);
}
@DeleteMapping("/{id}")
@Operation(summary = "Delete a user role")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "Role deleted successfully"),
@ApiResponse(responseCode = "404", description = "Role not found"),
@ApiResponse(responseCode = "500", description = "Internal server error")
})
public RoleDto deleteById(
@Parameter(description = "ID of the role to be deleted") @PathVariable String id) {
return roleFacade.deleteRole(id);
}
@Operation(
......@@ -96,9 +123,9 @@ public class RoleController {
schema = @Schema(implementation = Result.class))
})
})
@GetMapping("/all")
public List<Role> findAll(
@GetMapping
public List<RoleDto> findUserRoles(
@Parameter(description = "Page number of results to retrieve") @RequestParam String userId) {
return roleService.findAll();
return roleService.findAllByUser(userId);
}
}
package cz.muni.fi.pa165.core.user.roles;
import cz.muni.fi.pa165.core.company.CompanyService;
import cz.muni.fi.pa165.core.house.HouseService;
import cz.muni.fi.pa165.core.user.UserService;
import cz.muni.fi.pa165.model.dto.role.CompanyRoleDto;
import cz.muni.fi.pa165.model.dto.role.HouseRoleDto;
import cz.muni.fi.pa165.model.dto.role.RoleDto;
import cz.muni.fi.pa165.model.dto.role.enums.RoleTypeEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class RoleFacade {
private final RoleService roleService;
private final HouseService houseService;
private final UserService userService;
private final CompanyService companyService;
private final RoleMapper mapper;
@Autowired
public RoleFacade(RoleService service, HouseService houseService, UserService userService, CompanyService companyService, RoleMapper mapper) {
this.roleService = service;
this.houseService = houseService;
this.userService = userService;
this.companyService = companyService;
this.mapper = mapper;
}
public HouseRoleDto createHouseRole(HouseRoleDto entity){
HouseRole houseRole = mapper.fromHouseDto(entity);
houseRole.setHouse(houseService.findById(entity.getHouseId()));
houseRole.setUser(userService.findById(entity.getUserId()));
// TODO: how to mapp parent properties?
houseRole.setHouseRole(entity.getHouseRole());
houseRole.setRoleType(RoleTypeEnum.HouseRole);
return mapper.toHouseDto((HouseRole) roleService.create(houseRole));
}
public CompanyRoleDto createCompanyRole(CompanyRoleDto entity){
CompanyRole companyRole = mapper.fromCompanyDto(entity);
companyRole.setCompany(companyService.findById(entity.getCompanyId()));
companyRole.setUser(userService.findById(entity.getUserId()));
// TODO: how to mapp parent properties?
companyRole.setCompanyRoleEnum(entity.getCompanyRole());
companyRole.setRoleType(RoleTypeEnum.CompanyRole);
return mapper.toCompanyDto((CompanyRole) roleService.create(companyRole));
}
public RoleDto createGeneralRole(RoleDto entity){
Role role = mapper.fromGeneralDto(entity);
role.setUser(userService.findById(entity.getUserId()));
// TODO: how to mapp parent properties?
role.setRoleType(entity.getRoleType());
return mapper.toGeneralDto((Role) roleService.create(role));
}
public RoleDto deleteRole(String roleId){
return mapper.toGeneralDto((Role) roleService.deleteById(roleId));
}
public List<RoleDto> findAllByUser(String userId){
return mapper.toGeneralListDto(roleService.findAllByUser(userId));
}
}
package cz.muni.fi.pa165.core.user.roles;
import cz.muni.fi.pa165.core.common.DomainMapper;
import cz.muni.fi.pa165.core.smartmeter.SmartMeter;
import cz.muni.fi.pa165.model.dto.role.RoleDto;
import cz.muni.fi.pa165.model.dto.role.RoleCreateDto;
import cz.muni.fi.pa165.model.dto.role.RoleUpdateDto;
import cz.muni.fi.pa165.model.dto.smartDevice.SmartMeterCreateDto;
import cz.muni.fi.pa165.model.dto.smartDevice.SmartMeterDto;
import org.mapstruct.Mapping;
import cz.muni.fi.pa165.model.dto.role.*;
import org.mapstruct.Mapper;
import java.util.List;
public interface RoleMapper extends DomainMapper<Role, RoleDto, RoleCreateDto, RoleUpdateDto> {
/*
@Mapping(source = "deviceDto", target = "device")
SmartMeter fromCreateDto(SmartMeterCreateDto dto);
@Mapper
public interface RoleMapper{
HouseRole fromHouseDto(HouseRoleDto entity);
CompanyRole fromCompanyDto(CompanyRoleDto entity);
Role fromGeneralDto(RoleDto entity);
//@Mapping(source = "deviceDto", target = "device")
//SmartMeter fromUpdateDto(SmartMeterUpdateDto dto);
HouseRoleDto toHouseDto(HouseRole entity);
CompanyRoleDto toCompanyDto(CompanyRole entity);
RoleDto toGeneralDto(Role entity);
@Mapping(source = "roleDto", target = "role")
SmartMeter fromDto(SmartMeterDto dto);
@Mapping(source = "device", target = "deviceDto")
SmartMeterDto toDto(SmartMeter entity);
/*@Mapping(source = "device", target = "deviceDto")
List<SmartMeterDto> toDtoList(List<SmartMeter> entities);*/
List<RoleDto> toGeneralListDto(List<Role> entities);
}
......@@ -7,7 +7,7 @@ import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface RoleRepository extends JpaRepository<Role, String> {
public interface RoleRepository<T extends Role> extends JpaRepository<T, String> {
public List<Role> findAllByUser(String userId);
public List<T> findAllByUserId(String userId);
}
package cz.muni.fi.pa165.core.user.roles;
import cz.muni.fi.pa165.core.common.DomainObject;
import cz.muni.fi.pa165.core.common.DomainService;
import cz.muni.fi.pa165.model.dto.role.RoleDto;
import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
@Getter
@Setter
@Service
public class RoleService extends DomainService<Role> {
public class RoleService<T extends Role> extends DomainService<T> {
@Getter
private final RoleRepository repository;
......@@ -28,6 +24,6 @@ public class RoleService extends DomainService<Role> {
@Transactional
public List<Role> findAllByUser(String id){
return repository.findAllByUser(id);
return repository.findAllByUserId(id);
}
}
package cz.muni.fi.pa165.core.user.roles;
public enum RoleTypeEnum {
Admin,
Employee,
Owner
}
spring.h2.console.enabled=true
\ No newline at end of file
......@@ -13,6 +13,15 @@ logging:
spring:
mvc:
log-request-details: true
datasource:
url: jdbc:h2:mem:mydb
username: sa
password: password
driverClassName: org.h2.Driver
jpa:
spring.jpa.database-platform: org.hibernate.dialect.H2Dialect
h2:
console.enabled: true
springdoc:
# https://springdoc.org/properties.html#_springdoc_openapi_core_properties
......
......@@ -10,6 +10,7 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.regex.Pattern;
import static org.assertj.core.api.Assertions.assertThat;
......@@ -46,7 +47,7 @@ public class UnitTestCompanyJPA {
}
private Company helperRegister() {
return companyRepository.save(new Company("Tesla"));
return companyRepository.save(new Company("Tesla", new ArrayList<>()));
}
@Test
......
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