Skip to content

Commit 0f3e6e5

Browse files
committed
WIP_DIRECTORIES
1 parent e22fbb3 commit 0f3e6e5

File tree

46 files changed

+283
-278
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+283
-278
lines changed

commons/src/main/java/com/deftdevs/bootstrapi/commons/model/AbstractDirectoryModel.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import lombok.Data;
88
import lombok.NoArgsConstructor;
99

10-
import javax.validation.constraints.NotNull;
1110
import javax.xml.bind.annotation.XmlElement;
1211
import javax.xml.bind.annotation.XmlRootElement;
1312
import java.util.Date;
@@ -44,7 +43,6 @@ public abstract class AbstractDirectoryModel {
4443
private Long id;
4544

4645
@XmlElement
47-
@NotNull
4846
private String name;
4947

5048
@XmlElement

commons/src/main/java/com/deftdevs/bootstrapi/commons/rest/AbstractDirectoriesResourceImpl.java

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,35 @@
44
import com.deftdevs.bootstrapi.commons.rest.api.DirectoriesResource;
55
import com.deftdevs.bootstrapi.commons.service.api.DirectoriesService;
66

7-
import javax.ws.rs.core.Response;
8-
import java.util.List;
7+
import java.util.Map;
98

109
public abstract class AbstractDirectoriesResourceImpl implements DirectoriesResource {
1110

1211
private final DirectoriesService directoriesService;
1312

14-
public AbstractDirectoriesResourceImpl(DirectoriesService directoriesService) {
13+
public AbstractDirectoriesResourceImpl(
14+
final DirectoriesService directoriesService) {
15+
1516
this.directoriesService = directoriesService;
1617
}
1718

1819
@Override
19-
public Response getDirectories() {
20-
final List<AbstractDirectoryModel> directoryModels = directoriesService.getDirectories();
21-
return Response.ok(directoryModels).build();
20+
public Map<String, ? extends AbstractDirectoryModel> getDirectories() {
21+
return directoriesService.getDirectories();
2222
}
2323

2424
@Override
25-
public Response setDirectories (
26-
final boolean testConnection,
27-
final List<AbstractDirectoryModel> directories) {
25+
public Map<String, ? extends AbstractDirectoryModel> setDirectories (
26+
final Map<String, ? extends AbstractDirectoryModel> directories) {
2827

29-
List<AbstractDirectoryModel> directoryModels = directoriesService.setDirectories(directories, testConnection);
30-
return Response.ok(directoryModels).build();
28+
return directoriesService.setDirectories(directories);
3129
}
3230

3331
@Override
34-
public Response deleteDirectories(
32+
public void deleteDirectories(
3533
final boolean force) {
34+
3635
directoriesService.deleteDirectories(force);
37-
return Response.ok().build();
3836
}
3937

4038
}

commons/src/main/java/com/deftdevs/bootstrapi/commons/rest/api/DirectoriesResource.java

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,18 @@
44
import com.deftdevs.bootstrapi.commons.model.AbstractDirectoryModel;
55
import com.deftdevs.bootstrapi.commons.model.ErrorCollection;
66
import io.swagger.v3.oas.annotations.Operation;
7-
import io.swagger.v3.oas.annotations.media.ArraySchema;
87
import io.swagger.v3.oas.annotations.media.Content;
98
import io.swagger.v3.oas.annotations.media.Schema;
109
import io.swagger.v3.oas.annotations.responses.ApiResponse;
1110

12-
import javax.ws.rs.*;
11+
import javax.ws.rs.Consumes;
12+
import javax.ws.rs.DELETE;
13+
import javax.ws.rs.GET;
14+
import javax.ws.rs.PUT;
15+
import javax.ws.rs.Produces;
16+
import javax.ws.rs.QueryParam;
1317
import javax.ws.rs.core.MediaType;
14-
import javax.ws.rs.core.Response;
15-
import java.util.List;
18+
import java.util.Map;
1619

1720
public interface DirectoriesResource {
1821

@@ -23,38 +26,37 @@ public interface DirectoriesResource {
2326
summary = "Get all user directories",
2427
responses = {
2528
@ApiResponse(
26-
responseCode = "200", content = @Content(array = @ArraySchema(schema = @Schema(implementation = AbstractDirectoryModel.class))),
27-
description = "Returns all directories."
29+
responseCode = "200", content = @Content(schema = @Schema(type = "object", additionalPropertiesSchema = AbstractDirectoryModel.class)),
30+
description = "Returns directories mapped by their name."
2831
),
2932
@ApiResponse(
3033
responseCode = "default", content = @Content(schema = @Schema(implementation = ErrorCollection.class)),
3134
description = "Returns a list of error messages."
3235
),
3336
}
3437
)
35-
Response getDirectories();
38+
Map<String, ? extends AbstractDirectoryModel> getDirectories();
3639

3740
@PUT
3841
@Consumes(MediaType.APPLICATION_JSON)
3942
@Produces(MediaType.APPLICATION_JSON)
4043
@Operation(
4144
tags = { BootstrAPI.DIRECTORIES },
42-
summary = "Set a list of user directories",
45+
summary = "Set directories mapped by their name.",
4346
description = "NOTE: All existing directories with the same 'name' attribute are updated.",
4447
responses = {
4548
@ApiResponse(
46-
responseCode = "200", content = @Content(array = @ArraySchema(schema = @Schema(implementation = AbstractDirectoryModel.class))),
47-
description = "Returns all directories."
49+
responseCode = "200", content = @Content(schema = @Schema(type = "object", additionalPropertiesSchema = AbstractDirectoryModel.class)),
50+
description = "Returns directories mapped by their name."
4851
),
4952
@ApiResponse(
5053
responseCode = "default", content = @Content(schema = @Schema(implementation = ErrorCollection.class)),
5154
description = "Returns a list of error messages."
5255
),
5356
}
5457
)
55-
Response setDirectories(
56-
@QueryParam("test-connection") @DefaultValue("false") final boolean testConnection,
57-
final List<AbstractDirectoryModel> directories);
58+
Map<String, ? extends AbstractDirectoryModel> setDirectories(
59+
final Map<String, ? extends AbstractDirectoryModel> directories);
5860

5961
@DELETE
6062
@Operation(
@@ -72,7 +74,7 @@ Response setDirectories(
7274
),
7375
}
7476
)
75-
Response deleteDirectories(
77+
void deleteDirectories(
7678
@QueryParam("force") final boolean force);
7779

7880
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.deftdevs.bootstrapi.commons.service;
2+
3+
import com.deftdevs.bootstrapi.commons.exception.web.BadRequestException;
4+
import com.deftdevs.bootstrapi.commons.model.AbstractDirectoryModel;
5+
import com.deftdevs.bootstrapi.commons.service.api.DirectoriesService;
6+
7+
import java.util.LinkedHashMap;
8+
import java.util.Map;
9+
import java.util.Set;
10+
import java.util.function.Function;
11+
import java.util.stream.Collectors;
12+
13+
public abstract class AbstractDirectoriesService implements DirectoriesService {
14+
15+
@Override
16+
public Map<String, ? extends AbstractDirectoryModel> setDirectories(
17+
final Map<String, ? extends AbstractDirectoryModel> directoryModels) {
18+
19+
final Map<String, AbstractDirectoryModel> existingDirectoriesByName = getDirectories().values().stream()
20+
.collect(Collectors.toMap(AbstractDirectoryModel::getName, Function.identity()));
21+
22+
final Map<String, AbstractDirectoryModel> resultDirectories = new LinkedHashMap<>();
23+
24+
for (Map.Entry<String, ? extends AbstractDirectoryModel> directoryModelEntry : directoryModels.entrySet()) {
25+
final AbstractDirectoryModel directoryModel = directoryModelEntry.getValue();
26+
27+
// Check if directoryModel is not an instance of any supported class
28+
if (getSupportedClassesForUpdate().stream().noneMatch(clazz -> clazz.isInstance(directoryModel))) {
29+
throw new BadRequestException(String.format("Updating directory type '%s' is not supported (yet)", directoryModel.getClass()));
30+
}
31+
32+
final AbstractDirectoryModel existingDirectoryModel = existingDirectoriesByName.get(directoryModelEntry.getKey());
33+
final AbstractDirectoryModel resultDirectoryModel;
34+
35+
if (existingDirectoryModel != null) {
36+
resultDirectoryModel = setDirectory(existingDirectoryModel.getId(), directoryModelEntry.getValue(), false);
37+
} else {
38+
resultDirectoryModel = addDirectory(directoryModelEntry.getValue(), false);
39+
}
40+
41+
resultDirectories.put(resultDirectoryModel.getName(), resultDirectoryModel);
42+
}
43+
44+
return resultDirectories;
45+
}
46+
47+
protected abstract Set<Class<? extends AbstractDirectoryModel>> getSupportedClassesForUpdate();
48+
49+
}

commons/src/main/java/com/deftdevs/bootstrapi/commons/service/DefaultApplicationLinksServiceImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,11 @@ public List<ApplicationLinkModel> setApplicationLinks(
116116
return getApplicationLinks();
117117
}
118118

119+
@Override
120+
public Map<String, ApplicationLinkModel> setApplicationLinks(Map<String, ApplicationLinkModel> applicationLinkModels) {
121+
return Map.of();
122+
}
123+
119124
@Override
120125
public ApplicationLinkModel setApplicationLink(
121126
final UUID uuid,

commons/src/main/java/com/deftdevs/bootstrapi/commons/service/api/ApplicationLinksService.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.deftdevs.bootstrapi.commons.model.ApplicationLinkModel;
44

55
import java.util.List;
6+
import java.util.Map;
67
import java.util.UUID;
78

89
public interface ApplicationLinksService {
@@ -35,6 +36,15 @@ List<ApplicationLinkModel> setApplicationLinks(
3536
final List<ApplicationLinkModel> applicationLinkModels,
3637
boolean ignoreSetupErrors);
3738

39+
/**
40+
* Sets or updates the given application links
41+
*
42+
* @param applicationLinkModels the application links to set / update
43+
* @return the updated application links
44+
*/
45+
Map<String, ApplicationLinkModel> setApplicationLinks(
46+
final Map<String, ApplicationLinkModel> applicationLinkModels);
47+
3848
/**
3949
* Updates the given application link
4050
*

commons/src/main/java/com/deftdevs/bootstrapi/commons/service/api/DirectoriesService.java

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import com.deftdevs.bootstrapi.commons.model.AbstractDirectoryModel;
44

5-
import java.util.List;
5+
import java.util.Map;
66

77
/**
88
* The User directory service interface.
@@ -14,7 +14,7 @@ public interface DirectoriesService {
1414
*
1515
* @return the directories
1616
*/
17-
List<AbstractDirectoryModel> getDirectories();
17+
Map<String, ? extends AbstractDirectoryModel> getDirectories();
1818

1919
/**
2020
* Gets a single directory.
@@ -26,38 +26,36 @@ AbstractDirectoryModel getDirectory(
2626
final long id);
2727

2828
/**
29-
* Adds or Updates directory configurations. Any existing configurations with the same 'name' property is updated.
29+
* Adds or Updates directory configurations. Any existing configurations with the same key is updated.
3030
*
31-
* @param directories the directories
32-
* @param testConnection whether to test connection
31+
* @param directoryModels the directories
3332
* @return the directories
3433
*/
35-
List<AbstractDirectoryModel> setDirectories(
36-
List<AbstractDirectoryModel> directories,
37-
boolean testConnection);
34+
Map<String, ? extends AbstractDirectoryModel> setDirectories(
35+
Map<String, ? extends AbstractDirectoryModel> directoryModels);
3836

3937
/**
4038
* Updates a single directory configuration. Any existing configuration with the same 'name' property is updated.
4139
*
4240
* @param id the directory id to update
43-
* @param directory the directory
41+
* @param directoryModel the directory
4442
* @param testConnection whether to test connection
4543
* @return the directories
4644
*/
4745
AbstractDirectoryModel setDirectory(
4846
long id,
49-
AbstractDirectoryModel directory,
47+
AbstractDirectoryModel directoryModel,
5048
boolean testConnection);
5149

5250
/**
5351
* Adds a new directory configuration.
5452
*
55-
* @param directory the directories
53+
* @param directoryModel the directories
5654
* @param testConnection whether to test connection
5755
* @return the added directory
5856
*/
5957
AbstractDirectoryModel addDirectory(
60-
AbstractDirectoryModel directory,
58+
AbstractDirectoryModel directoryModel,
6159
boolean testConnection);
6260

6361
/**

commons/src/main/java/com/deftdevs/bootstrapi/commons/service/api/UsersService.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.deftdevs.bootstrapi.commons.model.UserModel;
44

55
import java.util.List;
6+
import java.util.Map;
67

78
public interface UsersService {
89

@@ -48,6 +49,17 @@ List<UserModel> setUsers(
4849
final long directoryId,
4950
final List<UserModel> userModels);
5051

52+
/**
53+
* Set (add or update) users.
54+
*
55+
* @param directoryId the directory id
56+
* @param userModels the user beans
57+
* @return the set user beans
58+
*/
59+
Map<String, UserModel> setUsers(
60+
final long directoryId,
61+
final Map<String, UserModel> userModels);
62+
5163
/**
5264
* Update the user.
5365
*

commons/src/test/java/com/deftdevs/bootstrapi/commons/rest/DirectoriesResourceTest.java

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@
1010
import org.mockito.Mock;
1111
import org.mockito.junit.jupiter.MockitoExtension;
1212

13-
import javax.ws.rs.core.Response;
14-
import java.util.Arrays;
1513
import java.util.Collections;
16-
import java.util.List;
14+
import java.util.Map;
15+
import java.util.function.Function;
16+
import java.util.stream.Collectors;
17+
import java.util.stream.Stream;
1718

1819
import static org.junit.jupiter.api.Assertions.assertEquals;
1920
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -35,27 +36,22 @@ public void setup() {
3536
@Test
3637
void testGetDirectories() {
3738
final DirectoryCrowdModel initialDirectoryModel = DirectoryCrowdModel.EXAMPLE_1;
38-
final List<AbstractDirectoryModel> directoryModels = Collections.singletonList(initialDirectoryModel);
39+
final Map<String, AbstractDirectoryModel> directoryModels = Collections.singletonMap(initialDirectoryModel.getName(), initialDirectoryModel);
3940
doReturn(directoryModels).when(directoriesService).getDirectories();
4041

41-
final Response response = resource.getDirectories();
42-
assertEquals(200, response.getStatus());
43-
44-
final List<AbstractDirectoryModel> responseDirectoryModels = (List<AbstractDirectoryModel>) response.getEntity();
45-
assertEquals(initialDirectoryModel, responseDirectoryModels.iterator().next());
42+
final Map<String, ? extends AbstractDirectoryModel> responseDirectoryModels = resource.getDirectories();
43+
assertEquals(initialDirectoryModel, responseDirectoryModels.values().iterator().next());
4644
}
4745

4846
@Test
4947
void testSetDirectories() {
5048
final DirectoryCrowdModel directoryModel1 = DirectoryCrowdModel.EXAMPLE_1;
5149
final DirectoryCrowdModel directoryModel2 = DirectoryCrowdModel.EXAMPLE_3;
52-
final List<AbstractDirectoryModel> directoryModels = Arrays.asList(directoryModel1, directoryModel2);
53-
doReturn(directoryModels).when(directoriesService).setDirectories(directoryModels, false);
54-
55-
final Response response = resource.setDirectories(Boolean.FALSE, directoryModels);
56-
assertEquals(200, response.getStatus());
50+
final Map<String, ? extends AbstractDirectoryModel> directoryModels = Stream.of(directoryModel1, directoryModel2)
51+
.collect(Collectors.toMap(AbstractDirectoryModel::getName, Function.identity()));
52+
doReturn(directoryModels).when(directoriesService).setDirectories(directoryModels);
5753

58-
final List<AbstractDirectoryModel> responseDirectoryModels = (List<AbstractDirectoryModel>) response.getEntity();
54+
final Map<String, ? extends AbstractDirectoryModel> responseDirectoryModels = resource.setDirectories(directoryModels);
5955
assertEquals(directoryModels.size(), responseDirectoryModels.size());
6056
}
6157

0 commit comments

Comments
 (0)