Skip to content

Commit ae99f26

Browse files
committed
wip
1 parent 8976ee1 commit ae99f26

File tree

7 files changed

+277
-183
lines changed

7 files changed

+277
-183
lines changed

dpp/pom.xml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,29 +44,29 @@
4444
<dependency>
4545
<groupId>org.springframework</groupId>
4646
<artifactId>spring-tx</artifactId>
47-
<scope>provided</scope>
47+
<version>7.0.6</version>
48+
<scope>compile</scope>
4849
</dependency>
4950

5051
<dependency>
5152
<groupId>org.jooq</groupId>
5253
<artifactId>jooq</artifactId>
54+
<version>3.20.11</version>
55+
<scope>compile</scope>
5356
</dependency>
5457

5558
<dependency>
5659
<groupId>com.zaxxer</groupId>
5760
<artifactId>HikariCP</artifactId>
61+
<version>7.0.2</version>
62+
<scope>compile</scope>
5863
</dependency>
5964

6065
<dependency>
6166
<groupId>org.postgresql</groupId>
6267
<artifactId>postgresql</artifactId>
63-
<scope>runtime</scope>
64-
</dependency>
65-
66-
<dependency>
67-
<groupId>org.modelmapper</groupId>
68-
<artifactId>modelmapper</artifactId>
69-
<version>3.1.1</version>
68+
<version>42.7.10</version>
69+
<scope>compile</scope>
7070
</dependency>
7171
</dependencies>
7272

dpp/src/main/java/io/github/linagora/linid/im/dpp/DatabaseProviderPlugin.java

Lines changed: 102 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@
2626

2727
package io.github.linagora.linid.im.dpp;
2828

29+
import io.github.linagora.linid.im.corelib.exception.ApiException;
30+
import io.github.linagora.linid.im.corelib.i18n.I18nMessage;
2931
import io.github.linagora.linid.im.corelib.plugin.config.JinjaService;
32+
import io.github.linagora.linid.im.corelib.plugin.config.dto.AttributeConfiguration;
3033
import io.github.linagora.linid.im.corelib.plugin.config.dto.ProviderConfiguration;
3134
import io.github.linagora.linid.im.corelib.plugin.entity.DynamicEntity;
3235
import io.github.linagora.linid.im.corelib.plugin.provider.ProviderPlugin;
@@ -39,6 +42,7 @@
3942
import java.util.HashMap;
4043
import java.util.List;
4144
import java.util.Map;
45+
import java.util.UUID;
4246

4347
import org.modelmapper.ModelMapper;
4448
import org.springframework.beans.factory.annotation.Autowired;
@@ -56,7 +60,10 @@
5660
@Component
5761
public class DatabaseProviderPlugin implements ProviderPlugin {
5862

63+
// TODO: javadoc
5964
private final CrudService crudService;
65+
66+
// TODO: javadoc
6067
private final TaskEngine taskEngine;
6168

6269
/**
@@ -81,23 +88,28 @@ public class DatabaseProviderPlugin implements ProviderPlugin {
8188
* @param jinjaService the service to render Jinja templates
8289
*/
8390
@Autowired
84-
public DatabaseProviderPlugin(CrudService crudService, TaskEngine taskEngine, JinjaService jinjaService) {
91+
public DatabaseProviderPlugin(final CrudService crudService,
92+
final TaskEngine taskEngine,
93+
final JinjaService jinjaService) {
8594
this.crudService = crudService;
8695
this.taskEngine = taskEngine;
8796
this.jinjaService = jinjaService;
8897
}
8998

9099
@Override
91-
public DynamicEntity create(
92-
TaskExecutionContext context,
93-
ProviderConfiguration config,
94-
DynamicEntity dynamicEntity) {
100+
public boolean supports(String type) {
101+
return "database".equals(type);
102+
}
103+
104+
@Override
105+
public DynamicEntity create(final TaskExecutionContext context,
106+
final ProviderConfiguration config,
107+
final DynamicEntity dynamicEntity) {
95108
DatabasePluginConfiguration databasePluginConfiguration = getDatabaseConfiguration("create", dynamicEntity);
96109
DynamicEntity result = crudService.insert(config, databasePluginConfiguration, dynamicEntity);
97110

98111
taskEngine.execute(dynamicEntity, context, "beforeDatabaseMappingCreate");
99112
var resultEntity = mappingEntity(context, databasePluginConfiguration, result);
100-
// todo: mappingEntity => DONE
101113
taskEngine.execute(dynamicEntity, context, "afterDatabaseMappingCreate");
102114

103115
return resultEntity;
@@ -112,41 +124,36 @@ public DynamicEntity create(
112124
* @param dynamicEntity entity metadata
113125
* @return true if deletion succeeded
114126
*/
115-
public boolean delete(
116-
TaskExecutionContext context,
117-
ProviderConfiguration config,
118-
String id,
119-
DynamicEntity dynamicEntity) {
120-
127+
public boolean delete(final TaskExecutionContext context,
128+
final ProviderConfiguration config,
129+
final String id,
130+
final DynamicEntity dynamicEntity) {
121131
DatabasePluginConfiguration databasePluginConfiguration = getDatabaseConfiguration("delete", dynamicEntity);
132+
String type = resolveIdType(dynamicEntity);
122133

123-
crudService.delete(config, databasePluginConfiguration, id, dynamicEntity);
134+
crudService.delete(config, databasePluginConfiguration, mapId(type, id), dynamicEntity);
124135

125136
return true;
126137
}
127138

128139
@Override
129-
public boolean supports(String type) {
130-
return "database".equals(type);
131-
}
132-
133-
@Override
134-
public DynamicEntity patch(
135-
TaskExecutionContext context,
136-
ProviderConfiguration config,
137-
String id,
138-
DynamicEntity dynamicEntity) {
139-
140+
public DynamicEntity patch(final TaskExecutionContext context,
141+
final ProviderConfiguration config,
142+
final String id,
143+
final DynamicEntity dynamicEntity) {
140144
DatabasePluginConfiguration databasePluginConfiguration = getDatabaseConfiguration("patch", dynamicEntity);
141-
DynamicEntity entity = crudService.selectOne(context, config, databasePluginConfiguration, id, dynamicEntity);
145+
String type = resolveIdType(dynamicEntity);
146+
Object validId = mapId(type, id);
142147

143-
if (entity != null) {
144-
ModelMapper modelMapper = new ModelMapper();
145-
modelMapper.map(dynamicEntity, entity);
146-
crudService.update(config, databasePluginConfiguration, id, entity);
147-
}
148+
DynamicEntity entity = crudService.selectOne(
149+
context,
150+
config,
151+
databasePluginConfiguration,
152+
validId,
153+
dynamicEntity
154+
);
148155

149-
DynamicEntity result = crudService.selectOne(context, config, databasePluginConfiguration, id, dynamicEntity);
156+
DynamicEntity result = crudService.update(config, databasePluginConfiguration, validId, entity);
150157

151158
taskEngine.execute(dynamicEntity, context, "beforeDatabaseMappingPatch");
152159
var resultEntity = mappingEntity(context, databasePluginConfiguration, result);
@@ -156,15 +163,20 @@ public DynamicEntity patch(
156163
}
157164

158165
@Override
159-
public DynamicEntity findById(
160-
TaskExecutionContext context,
161-
ProviderConfiguration config,
162-
String id,
163-
DynamicEntity dynamicEntity) {
164-
166+
public DynamicEntity findById(final TaskExecutionContext context,
167+
final ProviderConfiguration config,
168+
final String id,
169+
final DynamicEntity dynamicEntity) {
165170
DatabasePluginConfiguration databasePluginConfiguration = getDatabaseConfiguration("findById", dynamicEntity);
171+
String type = resolveIdType(dynamicEntity);
166172

167-
DynamicEntity result = crudService.selectOne(context, config, databasePluginConfiguration, id, dynamicEntity);
173+
DynamicEntity result = crudService.selectOne(
174+
context,
175+
config,
176+
databasePluginConfiguration,
177+
mapId(type, id),
178+
dynamicEntity
179+
);
168180

169181
taskEngine.execute(dynamicEntity, context, "beforeDatabaseMappingFindById");
170182
var resultEntity = mappingEntity(context, databasePluginConfiguration, result);
@@ -174,14 +186,14 @@ public DynamicEntity findById(
174186
}
175187

176188
@Override
177-
public Page<DynamicEntity> findAll(
178-
TaskExecutionContext context,
179-
ProviderConfiguration config,
180-
MultiValueMap<String, String> filters,
181-
Pageable pageable,
182-
DynamicEntity dynamicEntity) {
189+
public Page<DynamicEntity> findAll(final TaskExecutionContext context,
190+
final ProviderConfiguration config,
191+
final MultiValueMap<String, String> filters,
192+
final Pageable pageable,
193+
final DynamicEntity dynamicEntity) {
183194

184195
DatabasePluginConfiguration databasePluginConfiguration = getDatabaseConfiguration("findAll", dynamicEntity);
196+
185197
Page<DynamicEntity> result = crudService.select(context, config, databasePluginConfiguration, dynamicEntity,
186198
filters, pageable);
187199

@@ -193,28 +205,30 @@ public Page<DynamicEntity> findAll(
193205
}
194206

195207
@Override
196-
public DynamicEntity update(
197-
TaskExecutionContext context,
198-
ProviderConfiguration config,
199-
Object id,
200-
DynamicEntity dynamicEntity) {
201-
208+
public DynamicEntity update(final TaskExecutionContext context,
209+
final ProviderConfiguration config,
210+
final String id,
211+
final DynamicEntity dynamicEntity) {
202212
DatabasePluginConfiguration databasePluginConfiguration = getDatabaseConfiguration("update", dynamicEntity);
213+
String type = resolveIdType(dynamicEntity);
203214

204-
DynamicEntity result = crudService.update(config, databasePluginConfiguration, id, dynamicEntity);
215+
DynamicEntity result = crudService.update(
216+
config,
217+
databasePluginConfiguration,
218+
mapId(type, id),
219+
dynamicEntity
220+
);
205221

206-
// TODO: mappingEntity => DONE
207-
// TODO: missing bferoce Update => DONE
208-
// TODO: missing after Update => DONE
209222
taskEngine.execute(dynamicEntity, context, "beforeDatabaseMappingUpdate");
210223
DynamicEntity resultEntity = mappingEntity(context, databasePluginConfiguration, result);
211224
taskEngine.execute(dynamicEntity, context, "afterDatabaseMappingUpdate");
212225

213226
return resultEntity;
214227
}
215228

216-
public DynamicEntity mappingEntity(TaskExecutionContext taskContext, DatabasePluginConfiguration configuration,
217-
DynamicEntity dynamicEntity) {
229+
public DynamicEntity mappingEntity(final TaskExecutionContext taskContext,
230+
final DatabasePluginConfiguration configuration,
231+
final DynamicEntity dynamicEntity) {
218232
var result = new DynamicEntity();
219233

220234
result.setConfiguration(dynamicEntity.getConfiguration());
@@ -236,12 +250,14 @@ public DynamicEntity mappingEntity(TaskExecutionContext taskContext, DatabasePlu
236250
* @param configuration the database configuration containing entity mapping
237251
* details.
238252
* @param dynamicEntity the original dynamic entity context.
253+
// TODO Bad javadoc field
239254
* @param pageable the pagination information for the result set.
240255
* @return a pageable list of mapped entities.
241256
*/
242-
public Page<DynamicEntity> mappingEntities(TaskExecutionContext taskContext,
243-
DatabasePluginConfiguration configuration,
244-
DynamicEntity dynamicEntity, Page<DynamicEntity> selectResult) {
257+
public Page<DynamicEntity> mappingEntities(final TaskExecutionContext taskContext,
258+
final DatabasePluginConfiguration configuration,
259+
final DynamicEntity dynamicEntity,
260+
final Page<DynamicEntity> selectResult) {
245261
List<DynamicEntity> content = new ArrayList<>();
246262

247263
Pageable pageable = selectResult.getPageable();
@@ -261,7 +277,6 @@ public Page<DynamicEntity> mappingEntities(TaskExecutionContext taskContext,
261277
content.add(result);
262278
}
263279

264-
// Quel valeur mettre pour le total => content.size()
265280
return new PageImpl<>(content, pageable, selectResult.getTotalElements());
266281
}
267282

@@ -273,7 +288,7 @@ public Page<DynamicEntity> mappingEntities(TaskExecutionContext taskContext,
273288
* @param dynamicEntity the entity containing configuration maps.
274289
* @return the database configuration or an empty configuration if none found.
275290
*/
276-
public DatabasePluginConfiguration getDatabaseConfiguration(String action, DynamicEntity dynamicEntity) {
291+
public DatabasePluginConfiguration getDatabaseConfiguration(final String action, final DynamicEntity dynamicEntity) {
277292
var access = dynamicEntity.getConfiguration().getAccess();
278293

279294
if (!access.containsKey(action)) {
@@ -285,4 +300,30 @@ public DatabasePluginConfiguration getDatabaseConfiguration(String action, Dynam
285300
new TypeReference<>() {
286301
});
287302
}
303+
304+
public Object mapId(final String type, final String id) {
305+
return switch (type) {
306+
case "Long" -> Long.parseLong(id);
307+
case "Integer" -> Integer.parseInt(id);
308+
case "Double" -> Double.parseDouble(id);
309+
case "UUID" -> UUID.fromString(id);
310+
default -> id;
311+
};
312+
}
313+
314+
public String resolveIdType(final DynamicEntity dynamicEntity) {
315+
return dynamicEntity.getConfiguration().getAttributes().stream()
316+
.filter(attr -> Boolean.TRUE.equals(attr.getAccess().get("primaryKey")))
317+
.findFirst()
318+
.map(AttributeConfiguration::getType)
319+
.orElseThrow(
320+
() -> new ApiException(
321+
500,
322+
I18nMessage.of(
323+
"dpp.error.no-primary",
324+
Map.of("entity", dynamicEntity.getConfiguration().getName())
325+
)
326+
)
327+
);
328+
}
288329
}

dpp/src/main/java/io/github/linagora/linid/im/dpp/service/CrudService.java

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,12 @@ public interface CrudService {
5656
* @param pageable the pagination information (page number, page size, sorting)
5757
* @return the list
5858
*/
59-
Page<DynamicEntity> select(TaskExecutionContext context, ProviderConfiguration config, DatabasePluginConfiguration databaseConfiguration, DynamicEntity dynamicEntity, MultiValueMap<String, String> filters, Pageable pageable);
59+
Page<DynamicEntity> select(TaskExecutionContext context,
60+
ProviderConfiguration config,
61+
DatabasePluginConfiguration databaseConfiguration,
62+
DynamicEntity dynamicEntity,
63+
MultiValueMap<String, String> filters,
64+
Pageable pageable);
6065

6166
/**
6267
* Selects a single row from the given table matching the given id.
@@ -68,7 +73,11 @@ public interface CrudService {
6873
* @param dynamicEntity the dynamic entity containing the table name in its configuration
6974
* @return the matching entity, or null if not found
7075
*/
71-
DynamicEntity selectOne(TaskExecutionContext context, ProviderConfiguration config, DatabasePluginConfiguration databaseConfiguration, Object id, DynamicEntity dynamicEntity);
76+
DynamicEntity selectOne(TaskExecutionContext context,
77+
ProviderConfiguration config,
78+
DatabasePluginConfiguration databaseConfiguration,
79+
Object id,
80+
DynamicEntity dynamicEntity);
7281

7382
/**
7483
* Inserts a new row into the given table.
@@ -78,7 +87,9 @@ public interface CrudService {
7887
* @param dynamicEntity the dynamic entity containing the table name and values in its configuration
7988
* @return the inserted entity
8089
*/
81-
DynamicEntity insert(ProviderConfiguration config, DatabasePluginConfiguration databaseConfiguration, DynamicEntity dynamicEntity);
90+
DynamicEntity insert(ProviderConfiguration config,
91+
DatabasePluginConfiguration databaseConfiguration,
92+
DynamicEntity dynamicEntity);
8293

8394
/**
8495
* Updates rows in the given table where the id column matches the given value.
@@ -89,7 +100,24 @@ public interface CrudService {
89100
* @param dynamicEntity the dynamic entity containing the table name and values in its configuration
90101
* @return the updated entity
91102
*/
92-
DynamicEntity update(ProviderConfiguration config, DatabasePluginConfiguration databaseConfiguration, Object id, DynamicEntity dynamicEntity);
103+
DynamicEntity update(ProviderConfiguration config,
104+
DatabasePluginConfiguration databaseConfiguration,
105+
Object id,
106+
DynamicEntity dynamicEntity);
107+
108+
/**
109+
* Updates rows in the given table where the id column matches the given value.
110+
*
111+
* @param config the provider configuration (datasource credentials, pool settings)
112+
* @param databaseConfiguration the database configuration containing the table name
113+
* @param id the value the identifier column must match
114+
* @param dynamicEntity the dynamic entity containing the table name and values in its configuration
115+
* @return the updated entity
116+
*/
117+
DynamicEntity patch(ProviderConfiguration config,
118+
DatabasePluginConfiguration databaseConfiguration,
119+
Object id,
120+
DynamicEntity dynamicEntity);
93121

94122
/**
95123
* Deletes rows from the given table where the id column matches the given value.
@@ -99,5 +127,8 @@ public interface CrudService {
99127
* @param id the value the identifier column must match
100128
* @param dynamicEntity the dynamic entity containing the table name in its configuration
101129
*/
102-
void delete(ProviderConfiguration config, DatabasePluginConfiguration databaseConfiguration, Object id, DynamicEntity dynamicEntity);
130+
void delete(ProviderConfiguration config,
131+
DatabasePluginConfiguration databaseConfiguration,
132+
Object id,
133+
DynamicEntity dynamicEntity);
103134
}

0 commit comments

Comments
 (0)