2626
2727package 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 ;
2931import io .github .linagora .linid .im .corelib .plugin .config .JinjaService ;
32+ import io .github .linagora .linid .im .corelib .plugin .config .dto .AttributeConfiguration ;
3033import io .github .linagora .linid .im .corelib .plugin .config .dto .ProviderConfiguration ;
3134import io .github .linagora .linid .im .corelib .plugin .entity .DynamicEntity ;
3235import io .github .linagora .linid .im .corelib .plugin .provider .ProviderPlugin ;
3942import java .util .HashMap ;
4043import java .util .List ;
4144import java .util .Map ;
45+ import java .util .UUID ;
4246
4347import org .modelmapper .ModelMapper ;
4448import org .springframework .beans .factory .annotation .Autowired ;
5660@ Component
5761public 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}
0 commit comments