Skip to content

Commit

Permalink
#39 - expanding model, adding entity mappers
Browse files Browse the repository at this point in the history
  • Loading branch information
pveeckhout committed Jun 25, 2023
1 parent 7e97e55 commit 822b4a7
Show file tree
Hide file tree
Showing 16 changed files with 338 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,20 @@

import java.time.LocalDateTime;
import java.util.Set;
import java.util.UUID;

import lombok.Builder;
import lombok.Value;

@Value
@Builder
public class ApiKey {

UUID id;
String prefix;
String keyHash;
String name;
Set<UserRole> roles;
Set<ApiRole> roles;
Set<String> grants;
LocalDateTime expiryTimestamp;
boolean enabled;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.edpn.backend.user.domain.model;

import lombok.Builder;
import lombok.Value;

import java.util.Set;
import java.util.UUID;

@Value
@Builder
public class ApiRole {

UUID id;
String name;
Set<String> grants;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@

import java.time.LocalDateTime;
import java.util.Set;
import java.util.UUID;

import lombok.Builder;
import lombok.Value;

@Value
@Builder
public class EdpnUser {

UUID id;
String email;
String password;
LocalDateTime accountExpiryTimestamp;
Expand All @@ -17,4 +20,5 @@ public class EdpnUser {
boolean locked;
Set<UserRole> roles;
Set<String> grants;
Set<ApiKey> apiKeys;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,24 @@

import io.github.bucket4j.Bandwidth;
import io.github.bucket4j.Refill;
import lombok.Builder;
import lombok.Value;

import java.time.Duration;
import java.util.UUID;

@Value
@Builder
public class PricingPlan {

UUID id;
String name;
long capacityPerMinute;

public enum PricingPlan {
ANONYMOUS {
Bandwidth getLimit() {
return Bandwidth.classic(10, Refill.intervally(10, Duration.ofMinutes(1)));
}
},
FREE {
Bandwidth getLimit() {
return Bandwidth.classic(60, Refill.intervally(60, Duration.ofMinutes(1)));
}
},
INTERNAL {
Bandwidth getLimit() {
return Bandwidth.classic(6000, Refill.intervally(6000, Duration.ofMinutes(1)));
}
};
public Bandwidth getLimit() {
return Bandwidth.classic(capacityPerMinute, Refill.intervally(capacityPerMinute, Duration.ofMinutes(1)));
}

https://www.baeldung.com/spring-bucket4j
https://blog.hubspot.com/website/api-keys
//https://www.baeldung.com/spring-bucket4j
//https://blog.hubspot.com/website/api-keys
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package io.edpn.backend.user.domain.model;

import java.util.Set;
import java.util.UUID;

import lombok.Builder;
import lombok.Value;

@Value
@Builder
public class UserRole {

UUID id;
String name;
Set<String> grants;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package io.edpn.backend.user.infrastructure.entity;

import io.edpn.backend.user.domain.model.ApiRole;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

import java.time.LocalDateTime;
import java.util.Set;
import java.util.UUID;

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ApiKeyEntity {

private UUID id;
private String prefix;
private String keyHash;
private String name;
private Set<ApiRoleEntity> roles;
private Set<String> grants;
private LocalDateTime expiryTimestamp;
private boolean enabled;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package io.edpn.backend.user.infrastructure.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

import java.util.Set;
import java.util.UUID;

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ApiRoleEntity {

private UUID id;
private String name;
private Set<String> grants;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package io.edpn.backend.user.infrastructure.entity;

import io.edpn.backend.user.domain.model.ApiKey;
import io.edpn.backend.user.domain.model.UserRole;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

import java.time.LocalDateTime;
import java.util.Set;
import java.util.UUID;

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class EdpnUserEntity {

private UUID id;
private String email;
private String password;
private LocalDateTime accountExpiryTimestamp;
private LocalDateTime passwordExpiryTimestamp;
private boolean enabled;
private boolean locked;
private Set<UserRoleEntity> roles;
private Set<String> grants;
private Set<ApiKeyEntity> apiKeys;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package io.edpn.backend.user.infrastructure.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

import java.util.UUID;

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class PricingPlanEntity {

private UUID id;
private String name;
private long capacityPerMinute;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package io.edpn.backend.user.infrastructure.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

import java.util.Set;
import java.util.UUID;

@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserRoleEntity {

private UUID id;
private String name;
private Set<String> grants;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package io.edpn.backend.user.infrastructure.mapper;

import io.edpn.backend.user.domain.model.ApiKey;
import io.edpn.backend.user.infrastructure.entity.ApiKeyEntity;
import lombok.RequiredArgsConstructor;

import java.util.stream.Collectors;

@RequiredArgsConstructor
public class ApiKeyMapper {

private final ApiRoleMapper apiRoleMapper;

public ApiKey map(ApiKeyEntity entity) {
return ApiKey.builder()
.id(entity.getId())
.name(entity.getName())
.prefix(entity.getPrefix())
.keyHash(entity.getKeyHash())
.roles(entity.getRoles().stream().map(apiRoleMapper::map).collect(Collectors.toSet()))
.grants(entity.getGrants())
.expiryTimestamp(entity.getExpiryTimestamp())
.build();
}

public ApiKeyEntity map(ApiKey key) {
return ApiKeyEntity.builder()
.id(key.getId())
.name(key.getName())
.prefix(key.getPrefix())
.keyHash(key.getKeyHash())
.roles(key.getRoles().stream().map(apiRoleMapper::map).collect(Collectors.toSet()))
.grants(key.getGrants())
.expiryTimestamp(key.getExpiryTimestamp())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package io.edpn.backend.user.infrastructure.mapper;

import io.edpn.backend.user.domain.model.ApiRole;
import io.edpn.backend.user.infrastructure.entity.ApiRoleEntity;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class ApiRoleMapper {

public ApiRole map(ApiRoleEntity entity) {
return ApiRole.builder()
.id(entity.getId())
.name(entity.getName())
.grants(entity.getGrants())
.build();
}
public ApiRoleEntity map(ApiRole role) {
return ApiRoleEntity.builder()
.id(role.getId())
.name(role.getName())
.grants(role.getGrants())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package io.edpn.backend.user.infrastructure.mapper;

import io.edpn.backend.user.domain.model.EdpnUser;
import io.edpn.backend.user.infrastructure.entity.EdpnUserEntity;
import lombok.RequiredArgsConstructor;

import java.util.stream.Collectors;

@RequiredArgsConstructor
public class EdpnMapper {

private final UserRoleMapper userRoleMapper;
private final ApiKeyMapper apiKeyMapper;

public EdpnUser map(EdpnUserEntity entity) {
return EdpnUser.builder()
.id(entity.getId())
.email(entity.getEmail())
.password(null) // DO NOT RETURN EMAIL
.accountExpiryTimestamp(entity.getAccountExpiryTimestamp())
.passwordExpiryTimestamp(entity.getPasswordExpiryTimestamp())
.enabled(entity.isEnabled())
.locked(entity.isLocked())
.roles(entity.getRoles().stream().map(userRoleMapper::map).collect(Collectors.toSet()))
.grants(entity.getGrants())
.apiKeys(entity.getApiKeys().stream().map(apiKeyMapper::map).collect(Collectors.toSet()))
.build();
}

public EdpnUserEntity map(EdpnUser user) {
return EdpnUserEntity.builder()
.id(user.getId())
.email(user.getEmail())
.password(user.getPassword())
.accountExpiryTimestamp(user.getAccountExpiryTimestamp())
.passwordExpiryTimestamp(user.getPasswordExpiryTimestamp())
.enabled(user.isEnabled())
.locked(user.isLocked())
.roles(user.getRoles().stream().map(userRoleMapper::map).collect(Collectors.toSet()))
.grants(user.getGrants())
.apiKeys(user.getApiKeys().stream().map(apiKeyMapper::map).collect(Collectors.toSet()))
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package io.edpn.backend.user.infrastructure.mapper;

import io.edpn.backend.user.domain.model.PricingPlan;
import io.edpn.backend.user.infrastructure.entity.PricingPlanEntity;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class PricingPlanMapper {

public PricingPlan map(PricingPlanEntity entity) {
return PricingPlan.builder()
.id(entity.getId())
.name(entity.getName())
.capacityPerMinute(entity.getCapacityPerMinute())
.build();
}

public PricingPlanEntity map(PricingPlan entity) {
return PricingPlanEntity.builder()
.id(entity.getId())
.name(entity.getName())
.capacityPerMinute(entity.getCapacityPerMinute())
.build();
}
}
Loading

0 comments on commit 822b4a7

Please sign in to comment.