Skip to content

Commit

Permalink
feat: resolve identifier
Browse files Browse the repository at this point in the history
  • Loading branch information
sitepark-veltrup committed Feb 5, 2024
1 parent 3642937 commit 72a0cb3
Show file tree
Hide file tree
Showing 9 changed files with 287 additions and 9 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.sitepark.ies.userrepository.core.domain.entity;

import java.util.Optional;

public final class Identifier {

private final Long id;

private final Anchor anchor;

private Identifier(Long id) {
this.id = id;
this.anchor = null;
}

private Identifier(Anchor anchor) {
this.id = null;
this.anchor = anchor;
}

public static Identifier ofId(long id) {
return new Identifier(id);
}

public static Identifier ofAnchor(Anchor anchor) {
if (anchor == null) {
throw new NullPointerException("anchor is null");
}
return new Identifier(anchor);
}

public static Identifier ofString(String identifier) {
if (isId(identifier)) {
return new Identifier(Long.valueOf(identifier));
}
return new Identifier(Anchor.ofString(identifier));
}

public Optional<Long> getId() {
return Optional.ofNullable(this.id);
}

public Optional<Anchor> getAnchor() {
return Optional.ofNullable(this.anchor);
}

private static boolean isId(String str) {

int length = str.length();
if (length > 19) {
return false;
}

for (int i = 0; i < length; i++) {
char c = str.charAt(i);
if (c < '0' || c > '9') {
return false;
}
}
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ public class InvalidAnchorException extends UserRepositoryException {

private static final long serialVersionUID = 1L;

public InvalidAnchorException(String name) {
super();
this.name = name;
}


public InvalidAnchorException(String name, String message) {
super(message);
this.name = name;
Expand All @@ -21,6 +27,7 @@ public String getName() {

@Override
public String getMessage() {
return "Invalid anchor '" + this.name + ": " + super.getMessage();
return "Invalid anchor '" + this.name +
(super.getMessage() != null ? ": " + super.getMessage() : "");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.sitepark.ies.userrepository.core.domain.service;

import java.util.Optional;

import javax.inject.Inject;

import com.sitepark.ies.userrepository.core.domain.entity.Identifier;
import com.sitepark.ies.userrepository.core.domain.exception.AnchorNotFoundException;
import com.sitepark.ies.userrepository.core.port.UserRepository;

public class IdentifierResolver {

private final UserRepository repository;

@Inject
protected IdentifierResolver(UserRepository repository) {
this.repository = repository;
}

public long resolveIdentifier(Identifier identifier) {

if (identifier.getId().isPresent()) {
return identifier.getId().get();
}

Optional<Long> id = this.repository.resolveAnchor(identifier.getAnchor().get());
if (id.isEmpty()) {
throw new AnchorNotFoundException(identifier.getAnchor().get());
}
return id.get();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@

import javax.inject.Inject;

import com.sitepark.ies.userrepository.core.domain.entity.Identifier;
import com.sitepark.ies.userrepository.core.domain.entity.Role;
import com.sitepark.ies.userrepository.core.domain.entity.User;
import com.sitepark.ies.userrepository.core.domain.exception.AccessDeniedException;
import com.sitepark.ies.userrepository.core.domain.exception.UserNotFoundException;
import com.sitepark.ies.userrepository.core.domain.service.IdentifierResolver;
import com.sitepark.ies.userrepository.core.port.AccessControl;
import com.sitepark.ies.userrepository.core.port.RoleAssigner;
import com.sitepark.ies.userrepository.core.port.UserRepository;
Expand All @@ -16,21 +18,27 @@ public final class GetUser {

private final UserRepository repository;

private final IdentifierResolver identifierResolver;

private final RoleAssigner roleAssigner;

private final AccessControl accessControl;

@Inject
protected GetUser(
UserRepository repository,
IdentifierResolver identifierResolver,
RoleAssigner roleAssigner,
AccessControl accessControl) {
this.repository = repository;
this.identifierResolver = identifierResolver;
this.roleAssigner = roleAssigner;
this.accessControl = accessControl;
}

public User getUser(long id) {
public User getUser(Identifier identifier) {

long id = this.identifierResolver.resolveIdentifier(identifier);

if (!this.accessControl.isUserReadable(id)) {
throw new AccessDeniedException("Not allowed to reat user " + id);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.sitepark.ies.userrepository.core.domain.entity.Identifier;
import com.sitepark.ies.userrepository.core.domain.exception.AccessDeniedException;
import com.sitepark.ies.userrepository.core.domain.service.IdentifierResolver;
import com.sitepark.ies.userrepository.core.port.AccessControl;
import com.sitepark.ies.userrepository.core.port.AccessTokenRepository;
import com.sitepark.ies.userrepository.core.port.ExtensionsNotifier;
Expand All @@ -15,6 +17,8 @@ public final class PurgeUser {

private final UserRepository repository;

private final IdentifierResolver identifierResolver;

private final AccessTokenRepository accessTokenRepository;

private final ExtensionsNotifier extensionsNotifier;
Expand All @@ -26,17 +30,21 @@ public final class PurgeUser {
@Inject
protected PurgeUser(
UserRepository repository,
IdentifierResolver identifierResolver,
ExtensionsNotifier extensionsNotifier,
AccessControl accessControl,
AccessTokenRepository accessTokenRepository) {

this.repository = repository;
this.extensionsNotifier = extensionsNotifier;
this.identifierResolver = identifierResolver;
this.accessControl = accessControl;
this.accessTokenRepository = accessTokenRepository;
}

public void purgeUser(long id) {
public void purgeUser(Identifier identifier) {

long id = this.identifierResolver.resolveIdentifier(identifier);

if (!this.accessControl.isUserRemovable(id)) {
throw new AccessDeniedException("Not allowed to remove user " + id);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package com.sitepark.ies.userrepository.core.domain.entity;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

import java.util.Optional;

import org.junit.jupiter.api.Test;

class IdentifierTest {

@Test
void testOfStringToId() {
Identifier identifier = Identifier.ofString("123");
assertEquals(Optional.of(123L), identifier.getId(), "id exprected");
}

@Test
void testOfStringToAnchor() {
Identifier identifier = Identifier.ofString("abc");
Anchor anchor = Anchor.ofString("abc");
assertEquals(Optional.of(anchor), identifier.getAnchor(), "anchor exprected");
}

@Test
void testOfStringWithLongString() {
Identifier identifier = Identifier.ofString("abcdefghijklmnopqrstuvwxyz");
Anchor anchor = Anchor.ofString("abcdefghijklmnopqrstuvwxyz");
assertEquals(Optional.of(anchor), identifier.getAnchor(), "anchor exprected");
}

@Test
void testOfStringWithDot() {
Identifier identifier = Identifier.ofString("123.b");
Anchor anchor = Anchor.ofString("123.b");
assertEquals(Optional.of(anchor), identifier.getAnchor(), "anchor exprected");
}

@Test
void testOfId() {
Identifier identifier = Identifier.ofId(123L);
assertEquals(Optional.of(123L), identifier.getId(), "id exprected");
}

@Test
void testOfAnchor() {
Anchor anchor = Anchor.ofString("abc");
Identifier identifier = Identifier.ofAnchor(anchor);
assertEquals(
Optional.of(Anchor.ofString("abc")),
identifier.getAnchor(),
"anchor exprected");
}

@Test
void testOfAnchorWithNull() {
assertThrows(NullPointerException.class, () -> {
Identifier.ofAnchor(null);
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.sitepark.ies.userrepository.core.domain.service;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.Optional;

import org.junit.jupiter.api.Test;

import com.sitepark.ies.userrepository.core.domain.entity.Anchor;
import com.sitepark.ies.userrepository.core.domain.entity.Identifier;
import com.sitepark.ies.userrepository.core.domain.exception.AnchorNotFoundException;
import com.sitepark.ies.userrepository.core.port.UserRepository;

class IdentifierResolverTest {

@Test
void testResolveWithId() {

Identifier identifier = Identifier.ofId(123L);
UserRepository repository = mock();
IdentifierResolver resolver = new IdentifierResolver(repository);

long id = resolver.resolveIdentifier(identifier);

assertEquals(123L, id, "unexpected id");
}

@Test
void testResolveWithAnchor() {

Anchor anchor = Anchor.ofString("abc");
Identifier identifier = Identifier.ofAnchor(anchor);
UserRepository repository = mock();
when(repository.resolveAnchor(any())).thenReturn(Optional.of(123L));
IdentifierResolver resolver = new IdentifierResolver(repository);

long id = resolver.resolveIdentifier(identifier);

assertEquals(123L, id, "unexpected id");
}

@Test
void testResolveWithAnchorNotFound() {

Anchor anchor = Anchor.ofString("abc");
Identifier identifier = Identifier.ofAnchor(anchor);
UserRepository repository = mock();
when(repository.resolveAnchor(any())).thenReturn(Optional.empty());
IdentifierResolver resolver = new IdentifierResolver(repository);

assertThrows(AnchorNotFoundException.class, () -> {
resolver.resolveIdentifier(identifier);
});
}
}
Loading

0 comments on commit 72a0cb3

Please sign in to comment.