SEBSERV-17 #implementation of ExamDAO and improvements for bulk actions
This commit is contained in:
		
							parent
							
								
									1ba0345178
								
							
						
					
					
						commit
						2f8b796b86
					
				
					 16 changed files with 349 additions and 271 deletions
				
			
		|  | @ -27,15 +27,15 @@ import ch.ethz.seb.sebserver.webservice.servicelayer.dao.UserActivityLogDAO; | ||||||
| @WebServiceProfile | @WebServiceProfile | ||||||
| public class BulkActionService { | public class BulkActionService { | ||||||
| 
 | 
 | ||||||
|     private final Map<EntityType, BulkActionSupport> supporter; |     private final Map<EntityType, BulkActionSupportDAO<?>> supporter; | ||||||
|     private final UserActivityLogDAO userActivityLogDAO; |     private final UserActivityLogDAO userActivityLogDAO; | ||||||
| 
 | 
 | ||||||
|     public BulkActionService( |     public BulkActionService( | ||||||
|             final Collection<BulkActionSupport> supporter, |             final Collection<BulkActionSupportDAO<?>> supporter, | ||||||
|             final UserActivityLogDAO userActivityLogDAO) { |             final UserActivityLogDAO userActivityLogDAO) { | ||||||
| 
 | 
 | ||||||
|         this.supporter = new HashMap<>(); |         this.supporter = new HashMap<>(); | ||||||
|         for (final BulkActionSupport support : supporter) { |         for (final BulkActionSupportDAO<?> support : supporter) { | ||||||
|             this.supporter.put(support.entityType(), support); |             this.supporter.put(support.entityType(), support); | ||||||
|         } |         } | ||||||
|         this.userActivityLogDAO = userActivityLogDAO; |         this.userActivityLogDAO = userActivityLogDAO; | ||||||
|  | @ -43,7 +43,7 @@ public class BulkActionService { | ||||||
| 
 | 
 | ||||||
|     public void collectDependencies(final BulkAction action) { |     public void collectDependencies(final BulkAction action) { | ||||||
|         checkProcessing(action); |         checkProcessing(action); | ||||||
|         for (final BulkActionSupport sup : this.supporter.values()) { |         for (final BulkActionSupportDAO<?> sup : this.supporter.values()) { | ||||||
|             action.dependencies.addAll(sup.getDependencies(action)); |             action.dependencies.addAll(sup.getDependencies(action)); | ||||||
|         } |         } | ||||||
|         action.alreadyProcessed = true; |         action.alreadyProcessed = true; | ||||||
|  | @ -52,7 +52,7 @@ public class BulkActionService { | ||||||
|     public void doBulkAction(final BulkAction action) { |     public void doBulkAction(final BulkAction action) { | ||||||
|         checkProcessing(action); |         checkProcessing(action); | ||||||
| 
 | 
 | ||||||
|         final BulkActionSupport supportForSource = this.supporter.get(action.sourceType); |         final BulkActionSupportDAO<?> supportForSource = this.supporter.get(action.sourceType); | ||||||
|         if (supportForSource == null) { |         if (supportForSource == null) { | ||||||
|             action.alreadyProcessed = true; |             action.alreadyProcessed = true; | ||||||
|             return; |             return; | ||||||
|  | @ -62,10 +62,10 @@ public class BulkActionService { | ||||||
| 
 | 
 | ||||||
|         if (!action.dependencies.isEmpty()) { |         if (!action.dependencies.isEmpty()) { | ||||||
|             // process dependencies first... |             // process dependencies first... | ||||||
|             final List<BulkActionSupport> dependancySupporter = |             final List<BulkActionSupportDAO<?>> dependancySupporter = | ||||||
|                     getDependancySupporter(action); |                     getDependancySupporter(action); | ||||||
| 
 | 
 | ||||||
|             for (final BulkActionSupport support : dependancySupporter) { |             for (final BulkActionSupportDAO<?> support : dependancySupporter) { | ||||||
|                 action.result.addAll(support.processBulkAction(action)); |                 action.result.addAll(support.processBulkAction(action)); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | @ -111,12 +111,12 @@ public class BulkActionService { | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private List<BulkActionSupport> getDependancySupporter(final BulkAction action) { |     private List<BulkActionSupportDAO<?>> getDependancySupporter(final BulkAction action) { | ||||||
|         switch (action.type) { |         switch (action.type) { | ||||||
|             case ACTIVATE: |             case ACTIVATE: | ||||||
|             case DEACTIVATE: |             case DEACTIVATE: | ||||||
|             case HARD_DELETE: { |             case HARD_DELETE: { | ||||||
|                 final List<BulkActionSupport> dependantSupporterInHierarchicalOrder = |                 final List<BulkActionSupportDAO<?>> dependantSupporterInHierarchicalOrder = | ||||||
|                         getDependantSupporterInHierarchicalOrder(action); |                         getDependantSupporterInHierarchicalOrder(action); | ||||||
|                 Collections.reverse(dependantSupporterInHierarchicalOrder); |                 Collections.reverse(dependantSupporterInHierarchicalOrder); | ||||||
|                 return dependantSupporterInHierarchicalOrder; |                 return dependantSupporterInHierarchicalOrder; | ||||||
|  | @ -126,7 +126,7 @@ public class BulkActionService { | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private List<BulkActionSupport> getDependantSupporterInHierarchicalOrder(final BulkAction action) { |     private List<BulkActionSupportDAO<?>> getDependantSupporterInHierarchicalOrder(final BulkAction action) { | ||||||
|         switch (action.sourceType) { |         switch (action.sourceType) { | ||||||
|             case INSTITUTION: |             case INSTITUTION: | ||||||
|                 return Arrays.asList( |                 return Arrays.asList( | ||||||
|  |  | ||||||
|  | @ -1,50 +0,0 @@ | ||||||
| /* |  | ||||||
|  * Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET) |  | ||||||
|  * |  | ||||||
|  * This Source Code Form is subject to the terms of the Mozilla Public |  | ||||||
|  * License, v. 2.0. If a copy of the MPL was not distributed with this |  | ||||||
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| package ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction; |  | ||||||
| 
 |  | ||||||
| import java.util.Collection; |  | ||||||
| import java.util.Set; |  | ||||||
| import java.util.stream.Collectors; |  | ||||||
| 
 |  | ||||||
| import org.springframework.transaction.annotation.Transactional; |  | ||||||
| 
 |  | ||||||
| import ch.ethz.seb.sebserver.gbl.model.Entity; |  | ||||||
| import ch.ethz.seb.sebserver.gbl.model.EntityKey; |  | ||||||
| import ch.ethz.seb.sebserver.gbl.model.EntityKeyAndName; |  | ||||||
| import ch.ethz.seb.sebserver.gbl.model.EntityType; |  | ||||||
| import ch.ethz.seb.sebserver.gbl.util.Result; |  | ||||||
| 
 |  | ||||||
| public interface BulkActionSupport { |  | ||||||
| 
 |  | ||||||
|     /** Get the entity type for a concrete EntityDAO implementation. |  | ||||||
|      * |  | ||||||
|      * @return The EntityType for a concrete EntityDAO implementation */ |  | ||||||
|     EntityType entityType(); |  | ||||||
| 
 |  | ||||||
|     Set<EntityKey> getDependencies(BulkAction bulkAction); |  | ||||||
| 
 |  | ||||||
|     Result<Collection<Entity>> bulkLoadEntities(Collection<EntityKey> keys); |  | ||||||
| 
 |  | ||||||
|     @Transactional(readOnly = true) |  | ||||||
|     default Result<Collection<EntityKeyAndName>> bulkLoadEntityNames(final Collection<EntityKey> keys) { |  | ||||||
|         return Result.tryCatch(() -> { |  | ||||||
|             return bulkLoadEntities(keys) |  | ||||||
|                     .getOrThrow() |  | ||||||
|                     .stream() |  | ||||||
|                     .map(entity -> new EntityKeyAndName( |  | ||||||
|                             EntityType.INSTITUTION, |  | ||||||
|                             entity.getModelId(), |  | ||||||
|                             entity.getName())) |  | ||||||
|                     .collect(Collectors.toList()); |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     Collection<Result<EntityKey>> processBulkAction(BulkAction bulkAction); |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
|  | @ -0,0 +1,93 @@ | ||||||
|  | /* | ||||||
|  |  * Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET) | ||||||
|  |  * | ||||||
|  |  * This Source Code Form is subject to the terms of the Mozilla Public | ||||||
|  |  * License, v. 2.0. If a copy of the MPL was not distributed with this | ||||||
|  |  * file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | package ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction; | ||||||
|  | 
 | ||||||
|  | import java.util.Collection; | ||||||
|  | import java.util.Collections; | ||||||
|  | import java.util.Set; | ||||||
|  | import java.util.function.Function; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  | 
 | ||||||
|  | import org.slf4j.Logger; | ||||||
|  | import org.slf4j.LoggerFactory; | ||||||
|  | import org.springframework.transaction.annotation.Transactional; | ||||||
|  | 
 | ||||||
|  | import ch.ethz.seb.sebserver.gbl.model.Entity; | ||||||
|  | import ch.ethz.seb.sebserver.gbl.model.EntityKey; | ||||||
|  | import ch.ethz.seb.sebserver.gbl.model.EntityKeyAndName; | ||||||
|  | import ch.ethz.seb.sebserver.gbl.model.EntityType; | ||||||
|  | import ch.ethz.seb.sebserver.gbl.util.Result; | ||||||
|  | import ch.ethz.seb.sebserver.webservice.servicelayer.dao.ActivatableEntityDAO; | ||||||
|  | import ch.ethz.seb.sebserver.webservice.servicelayer.dao.EntityDAO; | ||||||
|  | 
 | ||||||
|  | public interface BulkActionSupportDAO<T extends Entity> { | ||||||
|  | 
 | ||||||
|  |     Logger log = LoggerFactory.getLogger(BulkActionSupportDAO.class); | ||||||
|  | 
 | ||||||
|  |     /** Get the entity type for a concrete EntityDAO implementation. | ||||||
|  |      * | ||||||
|  |      * @return The EntityType for a concrete EntityDAO implementation */ | ||||||
|  |     EntityType entityType(); | ||||||
|  | 
 | ||||||
|  |     Set<EntityKey> getDependencies(BulkAction bulkAction); | ||||||
|  | 
 | ||||||
|  |     Result<Collection<T>> bulkLoadEntities(Collection<EntityKey> keys); | ||||||
|  | 
 | ||||||
|  |     @Transactional(readOnly = true) | ||||||
|  |     default Result<Collection<EntityKeyAndName>> bulkLoadEntityNames(final Collection<EntityKey> keys) { | ||||||
|  |         return Result.tryCatch(() -> { | ||||||
|  |             return bulkLoadEntities(keys) | ||||||
|  |                     .getOrThrow() | ||||||
|  |                     .stream() | ||||||
|  |                     .map(entity -> new EntityKeyAndName( | ||||||
|  |                             EntityType.INSTITUTION, | ||||||
|  |                             entity.getModelId(), | ||||||
|  |                             entity.getName())) | ||||||
|  |                     .collect(Collectors.toList()); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Transactional | ||||||
|  |     default Collection<Result<EntityKey>> processBulkAction(final BulkAction bulkAction) { | ||||||
|  |         final Set<EntityKey> all = bulkAction.extractKeys(entityType()); | ||||||
|  | 
 | ||||||
|  |         switch (bulkAction.type) { | ||||||
|  |             case ACTIVATE: | ||||||
|  |                 return (this instanceof ActivatableEntityDAO) | ||||||
|  |                         ? ((ActivatableEntityDAO<?>) this).setActive(all, true) | ||||||
|  |                         : Collections.emptyList(); | ||||||
|  |             case DEACTIVATE: | ||||||
|  |                 return (this instanceof ActivatableEntityDAO) | ||||||
|  |                         ? ((ActivatableEntityDAO<?>) this).setActive(all, false) | ||||||
|  |                         : Collections.emptyList(); | ||||||
|  |             case HARD_DELETE: | ||||||
|  |                 return (this instanceof EntityDAO) | ||||||
|  |                         ? ((EntityDAO<?>) this).delete(all) | ||||||
|  |                         : Collections.emptyList(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         // should never happen | ||||||
|  |         throw new UnsupportedOperationException("Unsupported Bulk Action: " + bulkAction); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Transactional(readOnly = true) | ||||||
|  |     default Set<EntityKey> getDependencies( | ||||||
|  |             final BulkAction bulkAction, | ||||||
|  |             final Function<EntityKey, Result<Collection<EntityKey>>> selectionFunction) { | ||||||
|  | 
 | ||||||
|  |         return bulkAction.sources | ||||||
|  |                 .stream() | ||||||
|  |                 .map(selectionFunction) // apply select function for each source key | ||||||
|  |                 .peek(result -> result.onErrorDo(error -> log.error("Unexpected error: ", error))) | ||||||
|  |                 .flatMap(Result::skipOnError) // handle and skip results with error | ||||||
|  |                 .flatMap(Collection::stream) // Flatten stream of Collection in to one stream | ||||||
|  |                 .collect(Collectors.toSet()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -8,12 +8,12 @@ | ||||||
| 
 | 
 | ||||||
| package ch.ethz.seb.sebserver.webservice.servicelayer.dao; | package ch.ethz.seb.sebserver.webservice.servicelayer.dao; | ||||||
| 
 | 
 | ||||||
| import java.util.ArrayList; |  | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| import java.util.Collections; | import java.util.Collections; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
| import java.util.function.Predicate; | import java.util.function.Predicate; | ||||||
|  | import java.util.stream.Collectors; | ||||||
| 
 | 
 | ||||||
| import ch.ethz.seb.sebserver.gbl.model.Entity; | import ch.ethz.seb.sebserver.gbl.model.Entity; | ||||||
| import ch.ethz.seb.sebserver.gbl.model.EntityKey; | import ch.ethz.seb.sebserver.gbl.model.EntityKey; | ||||||
|  | @ -73,7 +73,7 @@ public interface EntityDAO<T extends Entity> { | ||||||
|      *         happened */ |      *         happened */ | ||||||
|     Collection<Result<EntityKey>> delete(Set<EntityKey> all); |     Collection<Result<EntityKey>> delete(Set<EntityKey> all); | ||||||
| 
 | 
 | ||||||
|     /** Utility method to extract an expected single resource entry form a Collection of specified type. |     /** Context based utility method to extract an expected single resource entry form a Collection of specified type. | ||||||
|      * Gets a Result refer to an expected single resource entry form a Collection of specified type or refer |      * Gets a Result refer to an expected single resource entry form a Collection of specified type or refer | ||||||
|      * to a ResourceNotFoundException if specified collection is null or empty or refer to a |      * to a ResourceNotFoundException if specified collection is null or empty or refer to a | ||||||
|      * unexpected RuntimeException if there are more then the expected single element in the given collection |      * unexpected RuntimeException if there are more then the expected single element in the given collection | ||||||
|  | @ -95,28 +95,27 @@ public interface EntityDAO<T extends Entity> { | ||||||
|         return Result.of(resources.iterator().next()); |         return Result.of(resources.iterator().next()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     default List<Long> extractIdsFromKeys( |     /** Context based utility method to extract a list of id's (PK) from a collection of various EntityKey | ||||||
|             final Collection<EntityKey> keys, |      * This uses the EntityType defined by this instance to filter all EntityKey by the given type and | ||||||
|             final Collection<Result<EntityKey>> result) { |      * convert the matching EntityKey's to id's (PK's) | ||||||
|  |      * | ||||||
|  |      * Use this if you need to transform a Collection of EntityKey into a extracted List of id's of a specified | ||||||
|  |      * EntityType | ||||||
|  |      * | ||||||
|  |      * @param keys Collection of EntityKey of various types | ||||||
|  |      * @return List of id's (PK's) from the given key collection that match the concrete EntityType */ | ||||||
|  |     default List<Long> extractIdsFromKeys(final Collection<EntityKey> keys) { | ||||||
| 
 | 
 | ||||||
|         if (keys == null) { |         if (keys == null) { | ||||||
|             return Collections.emptyList(); |             return Collections.emptyList(); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         final EntityType entityType = entityType(); |         final EntityType entityType = entityType(); | ||||||
|         final List<Long> ids = new ArrayList<>(); |         return keys | ||||||
| 
 |                 .stream() | ||||||
|         for (final EntityKey key : keys) { |                 .filter(key -> key.entityType == entityType) | ||||||
|             if (key.entityType == entityType) { |                 .map(key -> Long.valueOf(key.entityId)) | ||||||
|                 try { |                 .collect(Collectors.toList()); | ||||||
|                     ids.add(Long.valueOf(key.entityId)); |  | ||||||
|                 } catch (final Exception e) { |  | ||||||
|                     result.add(Result.ofError(new IllegalArgumentException("Invalid id for EntityKey: " + key))); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         return ids; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -13,8 +13,9 @@ import java.util.Collection; | ||||||
| import ch.ethz.seb.sebserver.gbl.model.exam.Exam; | import ch.ethz.seb.sebserver.gbl.model.exam.Exam; | ||||||
| import ch.ethz.seb.sebserver.gbl.model.exam.QuizData; | import ch.ethz.seb.sebserver.gbl.model.exam.QuizData; | ||||||
| import ch.ethz.seb.sebserver.gbl.util.Result; | import ch.ethz.seb.sebserver.gbl.util.Result; | ||||||
|  | import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkActionSupportDAO; | ||||||
| 
 | 
 | ||||||
| public interface ExamDAO extends ActivatableEntityDAO<Exam> { | public interface ExamDAO extends ActivatableEntityDAO<Exam>, BulkActionSupportDAO<Exam> { | ||||||
| 
 | 
 | ||||||
|     Result<Exam> importFromQuizData(QuizData quizData); |     Result<Exam> importFromQuizData(QuizData quizData); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -12,8 +12,9 @@ import java.util.Collection; | ||||||
| 
 | 
 | ||||||
| import ch.ethz.seb.sebserver.gbl.model.institution.Institution; | import ch.ethz.seb.sebserver.gbl.model.institution.Institution; | ||||||
| import ch.ethz.seb.sebserver.gbl.util.Result; | import ch.ethz.seb.sebserver.gbl.util.Result; | ||||||
|  | import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkActionSupportDAO; | ||||||
| 
 | 
 | ||||||
| public interface InstitutionDAO extends ActivatableEntityDAO<Institution> { | public interface InstitutionDAO extends ActivatableEntityDAO<Institution>, BulkActionSupportDAO<Institution> { | ||||||
| 
 | 
 | ||||||
|     Result<Collection<Institution>> allMatching(String name, Boolean active); |     Result<Collection<Institution>> allMatching(String name, Boolean active); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -15,8 +15,9 @@ import org.springframework.transaction.annotation.Transactional; | ||||||
| import ch.ethz.seb.sebserver.gbl.model.institution.LmsSetup; | import ch.ethz.seb.sebserver.gbl.model.institution.LmsSetup; | ||||||
| import ch.ethz.seb.sebserver.gbl.model.institution.LmsSetup.LmsType; | import ch.ethz.seb.sebserver.gbl.model.institution.LmsSetup.LmsType; | ||||||
| import ch.ethz.seb.sebserver.gbl.util.Result; | import ch.ethz.seb.sebserver.gbl.util.Result; | ||||||
|  | import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkActionSupportDAO; | ||||||
| 
 | 
 | ||||||
| public interface LmsSetupDAO extends ActivatableEntityDAO<LmsSetup> { | public interface LmsSetupDAO extends ActivatableEntityDAO<LmsSetup>, BulkActionSupportDAO<LmsSetup> { | ||||||
| 
 | 
 | ||||||
|     @Transactional(readOnly = true) |     @Transactional(readOnly = true) | ||||||
|     default Result<Collection<LmsSetup>> allOfInstitution(final Long institutionId, final Boolean active) { |     default Result<Collection<LmsSetup>> allOfInstitution(final Long institutionId, final Boolean active) { | ||||||
|  |  | ||||||
|  | @ -19,11 +19,12 @@ import ch.ethz.seb.sebserver.gbl.model.user.UserInfo; | ||||||
| import ch.ethz.seb.sebserver.gbl.model.user.UserMod; | import ch.ethz.seb.sebserver.gbl.model.user.UserMod; | ||||||
| import ch.ethz.seb.sebserver.gbl.util.Result; | import ch.ethz.seb.sebserver.gbl.util.Result; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.authorization.SEBServerUser; | import ch.ethz.seb.sebserver.webservice.servicelayer.authorization.SEBServerUser; | ||||||
|  | import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkActionSupportDAO; | ||||||
| 
 | 
 | ||||||
| /** The Data Access Object for all User related data like get user data within UserInfo, | /** The Data Access Object for all User related data like get user data within UserInfo, | ||||||
|  * save and modify user related data within UserMod and get internal user principal data |  * save and modify user related data within UserMod and get internal user principal data | ||||||
|  * within SEBServerUser. */ |  * within SEBServerUser. */ | ||||||
| public interface UserDAO extends ActivatableEntityDAO<UserInfo> { | public interface UserDAO extends ActivatableEntityDAO<UserInfo>, BulkActionSupportDAO<UserInfo> { | ||||||
| 
 | 
 | ||||||
|     /** Use this to get UserInfo by users UUID |     /** Use this to get UserInfo by users UUID | ||||||
|      * |      * | ||||||
|  | @ -87,6 +88,6 @@ public interface UserDAO extends ActivatableEntityDAO<UserInfo> { | ||||||
|      * |      * | ||||||
|      * @param uuid The UUID of the user |      * @param uuid The UUID of the user | ||||||
|      * @return a Collection containing EntityKey's of all entities that belongs to a given User */ |      * @return a Collection containing EntityKey's of all entities that belongs to a given User */ | ||||||
|     Collection<EntityKey> getAllUserData(String uuid); |     Collection<EntityKey> getAllUserRelatedData(String uuid); | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -8,8 +8,7 @@ | ||||||
| 
 | 
 | ||||||
| package ch.ethz.seb.sebserver.webservice.servicelayer.dao.impl; | package ch.ethz.seb.sebserver.webservice.servicelayer.dao.impl; | ||||||
| 
 | 
 | ||||||
| import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo; | import static org.mybatis.dynamic.sql.SqlBuilder.*; | ||||||
| import static org.mybatis.dynamic.sql.SqlBuilder.isEqualToWhenPresent; |  | ||||||
| 
 | 
 | ||||||
| import java.util.Arrays; | import java.util.Arrays; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
|  | @ -17,6 +16,7 @@ import java.util.Collections; | ||||||
| import java.util.HashMap; | import java.util.HashMap; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
|  | import java.util.function.Function; | ||||||
| import java.util.function.Predicate; | import java.util.function.Predicate; | ||||||
| import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||||
| 
 | 
 | ||||||
|  | @ -29,7 +29,6 @@ import org.springframework.stereotype.Component; | ||||||
| import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||||
| 
 | 
 | ||||||
| import ch.ethz.seb.sebserver.gbl.Constants; | import ch.ethz.seb.sebserver.gbl.Constants; | ||||||
| import ch.ethz.seb.sebserver.gbl.model.Entity; |  | ||||||
| import ch.ethz.seb.sebserver.gbl.model.EntityKey; | import ch.ethz.seb.sebserver.gbl.model.EntityKey; | ||||||
| import ch.ethz.seb.sebserver.gbl.model.EntityType; | import ch.ethz.seb.sebserver.gbl.model.EntityType; | ||||||
| import ch.ethz.seb.sebserver.gbl.model.exam.Exam; | import ch.ethz.seb.sebserver.gbl.model.exam.Exam; | ||||||
|  | @ -42,14 +41,13 @@ import ch.ethz.seb.sebserver.webservice.datalayer.batis.mapper.ExamRecordDynamic | ||||||
| import ch.ethz.seb.sebserver.webservice.datalayer.batis.mapper.ExamRecordMapper; | import ch.ethz.seb.sebserver.webservice.datalayer.batis.mapper.ExamRecordMapper; | ||||||
| import ch.ethz.seb.sebserver.webservice.datalayer.batis.model.ExamRecord; | import ch.ethz.seb.sebserver.webservice.datalayer.batis.model.ExamRecord; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkAction; | import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkAction; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkActionSupport; |  | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.dao.ExamDAO; | import ch.ethz.seb.sebserver.webservice.servicelayer.dao.ExamDAO; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.dao.ResourceNotFoundException; | import ch.ethz.seb.sebserver.webservice.servicelayer.dao.ResourceNotFoundException; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.lms.LmsAPIService; | import ch.ethz.seb.sebserver.webservice.servicelayer.lms.LmsAPIService; | ||||||
| 
 | 
 | ||||||
| @Lazy | @Lazy | ||||||
| @Component | @Component | ||||||
| public class ExamDAOImpl implements ExamDAO, BulkActionSupport { | public class ExamDAOImpl implements ExamDAO { | ||||||
| 
 | 
 | ||||||
|     private final ExamRecordMapper examRecordMapper; |     private final ExamRecordMapper examRecordMapper; | ||||||
|     private final LmsAPIService lmsAPIService; |     private final LmsAPIService lmsAPIService; | ||||||
|  | @ -162,20 +160,6 @@ public class ExamDAOImpl implements ExamDAO, BulkActionSupport { | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |  | ||||||
|     @Transactional |  | ||||||
|     public Collection<Result<EntityKey>> setActive(final Set<EntityKey> all, final boolean active) { |  | ||||||
|         // TODO Auto-generated method stub |  | ||||||
|         return Collections.emptyList(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Override |  | ||||||
|     @Transactional |  | ||||||
|     public Collection<Result<EntityKey>> delete(final Set<EntityKey> all) { |  | ||||||
|         // TODO Auto-generated method stub |  | ||||||
|         return Collections.emptyList(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Override |     @Override | ||||||
|     @Transactional |     @Transactional | ||||||
|     public Result<Exam> importFromQuizData(final QuizData quizData) { |     public Result<Exam> importFromQuizData(final QuizData quizData) { | ||||||
|  | @ -184,24 +168,105 @@ public class ExamDAOImpl implements ExamDAO, BulkActionSupport { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     @Transactional(readOnly = true) |     @Transactional | ||||||
|     public Set<EntityKey> getDependencies(final BulkAction bulkAction) { |     public Collection<Result<EntityKey>> setActive(final Set<EntityKey> all, final boolean active) { | ||||||
|         // TODO Auto-generated method stub |         final List<Long> ids = extractIdsFromKeys(all); | ||||||
|         return Collections.emptySet(); |         final ExamRecord examRecord = new ExamRecord(null, null, null, null, null, | ||||||
|     } |                 null, null, null, BooleanUtils.toInteger(active)); | ||||||
| 
 | 
 | ||||||
|     @Override |         try { | ||||||
|     @Transactional(readOnly = true) | 
 | ||||||
|     public Result<Collection<Entity>> bulkLoadEntities(final Collection<EntityKey> keys) { |             this.examRecordMapper.updateByExampleSelective(examRecord) | ||||||
|         // TODO Auto-generated method stub |                     .where(ExamRecordDynamicSqlSupport.id, isIn(ids)) | ||||||
|         return Result.ofTODO(); |                     .build() | ||||||
|  |                     .execute(); | ||||||
|  | 
 | ||||||
|  |             return ids.stream() | ||||||
|  |                     .map(id -> Result.of(new EntityKey(id, EntityType.EXAM))) | ||||||
|  |                     .collect(Collectors.toList()); | ||||||
|  | 
 | ||||||
|  |         } catch (final Exception e) { | ||||||
|  |             return ids.stream() | ||||||
|  |                     .map(id -> Result.<EntityKey> ofError(new RuntimeException( | ||||||
|  |                             "Activation failed on unexpected exception for Exam of id: " + id, e))) | ||||||
|  |                     .collect(Collectors.toList()); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     @Transactional |     @Transactional | ||||||
|     public Collection<Result<EntityKey>> processBulkAction(final BulkAction bulkAction) { |     public Collection<Result<EntityKey>> delete(final Set<EntityKey> all) { | ||||||
|         // TODO Auto-generated method stub |         final List<Long> ids = extractIdsFromKeys(all); | ||||||
|         return Collections.emptyList(); | 
 | ||||||
|  |         try { | ||||||
|  | 
 | ||||||
|  |             this.examRecordMapper.deleteByExample() | ||||||
|  |                     .where(ExamRecordDynamicSqlSupport.id, isIn(ids)) | ||||||
|  |                     .build() | ||||||
|  |                     .execute(); | ||||||
|  | 
 | ||||||
|  |             return ids.stream() | ||||||
|  |                     .map(id -> Result.of(new EntityKey(id, EntityType.EXAM))) | ||||||
|  |                     .collect(Collectors.toList()); | ||||||
|  | 
 | ||||||
|  |         } catch (final Exception e) { | ||||||
|  |             return ids.stream() | ||||||
|  |                     .map(id -> Result.<EntityKey> ofError(new RuntimeException( | ||||||
|  |                             "Deletion failed on unexpected exception for Exam of id: " + id, e))) | ||||||
|  |                     .collect(Collectors.toList()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     @Transactional(readOnly = true) | ||||||
|  |     public Set<EntityKey> getDependencies(final BulkAction bulkAction) { | ||||||
|  |         // define the select function in case of source type | ||||||
|  |         final Function<EntityKey, Result<Collection<EntityKey>>> selectionFunction = | ||||||
|  |                 (bulkAction.sourceType == EntityType.INSTITUTION) | ||||||
|  |                         ? this::allIdsOfInstitution | ||||||
|  |                         : (bulkAction.sourceType == EntityType.LMS_SETUP) | ||||||
|  |                                 ? this::allIdsOfLmsSetup | ||||||
|  |                                 : key -> Result.of(Collections.emptyList()); // else : empty select function | ||||||
|  | 
 | ||||||
|  |         return getDependencies(bulkAction, selectionFunction); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     @Transactional(readOnly = true) | ||||||
|  |     public Result<Collection<Exam>> bulkLoadEntities(final Collection<EntityKey> keys) { | ||||||
|  |         return Result.tryCatch(() -> { | ||||||
|  |             final List<Long> ids = extractIdsFromKeys(keys); | ||||||
|  |             return this.examRecordMapper.selectByExample() | ||||||
|  |                     .where(ExamRecordDynamicSqlSupport.id, isIn(ids)) | ||||||
|  |                     .build() | ||||||
|  |                     .execute(); | ||||||
|  |         }).flatMap(this::toDomainModel); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private Result<Collection<EntityKey>> allIdsOfInstitution(final EntityKey institutionKey) { | ||||||
|  |         return Result.tryCatch(() -> { | ||||||
|  |             return this.examRecordMapper.selectIdsByExample() | ||||||
|  |                     .where(ExamRecordDynamicSqlSupport.institutionId, | ||||||
|  |                             isEqualTo(Long.valueOf(institutionKey.entityId))) | ||||||
|  |                     .build() | ||||||
|  |                     .execute() | ||||||
|  |                     .stream() | ||||||
|  |                     .map(id -> new EntityKey(id, EntityType.LMS_SETUP)) | ||||||
|  |                     .collect(Collectors.toList()); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private Result<Collection<EntityKey>> allIdsOfLmsSetup(final EntityKey lmsSetupKey) { | ||||||
|  |         return Result.tryCatch(() -> { | ||||||
|  |             return this.examRecordMapper.selectIdsByExample() | ||||||
|  |                     .where(ExamRecordDynamicSqlSupport.lmsSetupId, | ||||||
|  |                             isEqualTo(Long.valueOf(lmsSetupKey.entityId))) | ||||||
|  |                     .build() | ||||||
|  |                     .execute() | ||||||
|  |                     .stream() | ||||||
|  |                     .map(id -> new EntityKey(id, EntityType.LMS_SETUP)) | ||||||
|  |                     .collect(Collectors.toList()); | ||||||
|  |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private Result<ExamRecord> recordById(final Long id) { |     private Result<ExamRecord> recordById(final Long id) { | ||||||
|  |  | ||||||
|  | @ -11,7 +11,6 @@ package ch.ethz.seb.sebserver.webservice.servicelayer.dao.impl; | ||||||
| import static org.mybatis.dynamic.sql.SqlBuilder.isEqualToWhenPresent; | import static org.mybatis.dynamic.sql.SqlBuilder.isEqualToWhenPresent; | ||||||
| import static org.mybatis.dynamic.sql.SqlBuilder.isIn; | import static org.mybatis.dynamic.sql.SqlBuilder.isIn; | ||||||
| 
 | 
 | ||||||
| import java.util.ArrayList; |  | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| import java.util.Collections; | import java.util.Collections; | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  | @ -27,7 +26,6 @@ import org.springframework.context.annotation.Lazy; | ||||||
| import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||||
| import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||||
| 
 | 
 | ||||||
| import ch.ethz.seb.sebserver.gbl.model.Entity; |  | ||||||
| import ch.ethz.seb.sebserver.gbl.model.EntityKey; | import ch.ethz.seb.sebserver.gbl.model.EntityKey; | ||||||
| import ch.ethz.seb.sebserver.gbl.model.EntityType; | import ch.ethz.seb.sebserver.gbl.model.EntityType; | ||||||
| import ch.ethz.seb.sebserver.gbl.model.institution.Institution; | import ch.ethz.seb.sebserver.gbl.model.institution.Institution; | ||||||
|  | @ -37,14 +35,13 @@ import ch.ethz.seb.sebserver.webservice.datalayer.batis.mapper.InstitutionRecord | ||||||
| import ch.ethz.seb.sebserver.webservice.datalayer.batis.mapper.InstitutionRecordMapper; | import ch.ethz.seb.sebserver.webservice.datalayer.batis.mapper.InstitutionRecordMapper; | ||||||
| import ch.ethz.seb.sebserver.webservice.datalayer.batis.model.InstitutionRecord; | import ch.ethz.seb.sebserver.webservice.datalayer.batis.model.InstitutionRecord; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkAction; | import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkAction; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkActionSupport; |  | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.dao.InstitutionDAO; | import ch.ethz.seb.sebserver.webservice.servicelayer.dao.InstitutionDAO; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.dao.ResourceNotFoundException; | import ch.ethz.seb.sebserver.webservice.servicelayer.dao.ResourceNotFoundException; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.dao.TransactionHandler; | import ch.ethz.seb.sebserver.webservice.servicelayer.dao.TransactionHandler; | ||||||
| 
 | 
 | ||||||
| @Lazy | @Lazy | ||||||
| @Component | @Component | ||||||
| public class InstitutionDAOImpl implements InstitutionDAO, BulkActionSupport { | public class InstitutionDAOImpl implements InstitutionDAO { | ||||||
| 
 | 
 | ||||||
|     private final InstitutionRecordMapper institutionRecordMapper; |     private final InstitutionRecordMapper institutionRecordMapper; | ||||||
| 
 | 
 | ||||||
|  | @ -126,9 +123,7 @@ public class InstitutionDAOImpl implements InstitutionDAO, BulkActionSupport { | ||||||
|     @Override |     @Override | ||||||
|     @Transactional |     @Transactional | ||||||
|     public Collection<Result<EntityKey>> setActive(final Set<EntityKey> all, final boolean active) { |     public Collection<Result<EntityKey>> setActive(final Set<EntityKey> all, final boolean active) { | ||||||
|         final Collection<Result<EntityKey>> result = new ArrayList<>(); |         final List<Long> ids = extractIdsFromKeys(all); | ||||||
| 
 |  | ||||||
|         final List<Long> ids = extractIdsFromKeys(all, result); |  | ||||||
|         final InstitutionRecord institutionRecord = new InstitutionRecord( |         final InstitutionRecord institutionRecord = new InstitutionRecord( | ||||||
|                 null, null, null, BooleanUtils.toInteger(active), null); |                 null, null, null, BooleanUtils.toInteger(active), null); | ||||||
| 
 | 
 | ||||||
|  | @ -152,8 +147,7 @@ public class InstitutionDAOImpl implements InstitutionDAO, BulkActionSupport { | ||||||
|     @Override |     @Override | ||||||
|     @Transactional |     @Transactional | ||||||
|     public Collection<Result<EntityKey>> delete(final Set<EntityKey> all) { |     public Collection<Result<EntityKey>> delete(final Set<EntityKey> all) { | ||||||
|         final Collection<Result<EntityKey>> result = new ArrayList<>(); |         final List<Long> ids = extractIdsFromKeys(all); | ||||||
|         final List<Long> ids = extractIdsFromKeys(all, result); |  | ||||||
| 
 | 
 | ||||||
|         try { |         try { | ||||||
|             this.institutionRecordMapper.deleteByExample() |             this.institutionRecordMapper.deleteByExample() | ||||||
|  | @ -181,10 +175,9 @@ public class InstitutionDAOImpl implements InstitutionDAO, BulkActionSupport { | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     @Transactional(readOnly = true) |     @Transactional(readOnly = true) | ||||||
|     public Result<Collection<Entity>> bulkLoadEntities(final Collection<EntityKey> keys) { |     public Result<Collection<Institution>> bulkLoadEntities(final Collection<EntityKey> keys) { | ||||||
|         return Result.tryCatch(() -> { |         return Result.tryCatch(() -> { | ||||||
|             final Collection<Result<EntityKey>> result = new ArrayList<>(); |             final List<Long> ids = extractIdsFromKeys(keys); | ||||||
|             final List<Long> ids = extractIdsFromKeys(keys, result); |  | ||||||
| 
 | 
 | ||||||
|             return this.institutionRecordMapper.selectByExample() |             return this.institutionRecordMapper.selectByExample() | ||||||
|                     .where(InstitutionRecordDynamicSqlSupport.id, isIn(ids)) |                     .where(InstitutionRecordDynamicSqlSupport.id, isIn(ids)) | ||||||
|  | @ -197,25 +190,6 @@ public class InstitutionDAOImpl implements InstitutionDAO, BulkActionSupport { | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |  | ||||||
|     @Transactional |  | ||||||
|     public Collection<Result<EntityKey>> processBulkAction(final BulkAction bulkAction) { |  | ||||||
| 
 |  | ||||||
|         final Set<EntityKey> all = bulkAction.extractKeys(EntityType.INSTITUTION); |  | ||||||
| 
 |  | ||||||
|         switch (bulkAction.type) { |  | ||||||
|             case ACTIVATE: |  | ||||||
|                 return setActive(all, true); |  | ||||||
|             case DEACTIVATE: |  | ||||||
|                 return setActive(all, false); |  | ||||||
|             case HARD_DELETE: |  | ||||||
|                 return delete(all); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // should never happen |  | ||||||
|         throw new UnsupportedOperationException("Unsupported Bulk Action: " + bulkAction); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private Result<InstitutionRecord> recordById(final Long id) { |     private Result<InstitutionRecord> recordById(final Long id) { | ||||||
|         return Result.tryCatch(() -> { |         return Result.tryCatch(() -> { | ||||||
|             final InstitutionRecord record = this.institutionRecordMapper.selectByPrimaryKey(id); |             final InstitutionRecord record = this.institutionRecordMapper.selectByPrimaryKey(id); | ||||||
|  |  | ||||||
|  | @ -11,10 +11,8 @@ package ch.ethz.seb.sebserver.webservice.servicelayer.dao.impl; | ||||||
| import static ch.ethz.seb.sebserver.gbl.util.Utils.toSQLWildcard; | import static ch.ethz.seb.sebserver.gbl.util.Utils.toSQLWildcard; | ||||||
| import static org.mybatis.dynamic.sql.SqlBuilder.*; | import static org.mybatis.dynamic.sql.SqlBuilder.*; | ||||||
| 
 | 
 | ||||||
| import java.util.ArrayList; |  | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| import java.util.Collections; | import java.util.Collections; | ||||||
| import java.util.HashSet; |  | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
| import java.util.function.Predicate; | import java.util.function.Predicate; | ||||||
|  | @ -23,13 +21,10 @@ import java.util.stream.Collectors; | ||||||
| import org.apache.commons.lang3.BooleanUtils; | import org.apache.commons.lang3.BooleanUtils; | ||||||
| import org.mybatis.dynamic.sql.select.MyBatis3SelectModelAdapter; | import org.mybatis.dynamic.sql.select.MyBatis3SelectModelAdapter; | ||||||
| import org.mybatis.dynamic.sql.select.QueryExpressionDSL; | import org.mybatis.dynamic.sql.select.QueryExpressionDSL; | ||||||
| import org.slf4j.Logger; |  | ||||||
| import org.slf4j.LoggerFactory; |  | ||||||
| import org.springframework.context.annotation.Lazy; | import org.springframework.context.annotation.Lazy; | ||||||
| import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||||
| import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||||
| 
 | 
 | ||||||
| import ch.ethz.seb.sebserver.gbl.model.Entity; |  | ||||||
| import ch.ethz.seb.sebserver.gbl.model.EntityKey; | import ch.ethz.seb.sebserver.gbl.model.EntityKey; | ||||||
| import ch.ethz.seb.sebserver.gbl.model.EntityType; | import ch.ethz.seb.sebserver.gbl.model.EntityType; | ||||||
| import ch.ethz.seb.sebserver.gbl.model.institution.LmsSetup; | import ch.ethz.seb.sebserver.gbl.model.institution.LmsSetup; | ||||||
|  | @ -39,16 +34,13 @@ import ch.ethz.seb.sebserver.webservice.datalayer.batis.mapper.LmsSetupRecordDyn | ||||||
| import ch.ethz.seb.sebserver.webservice.datalayer.batis.mapper.LmsSetupRecordMapper; | import ch.ethz.seb.sebserver.webservice.datalayer.batis.mapper.LmsSetupRecordMapper; | ||||||
| import ch.ethz.seb.sebserver.webservice.datalayer.batis.model.LmsSetupRecord; | import ch.ethz.seb.sebserver.webservice.datalayer.batis.model.LmsSetupRecord; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkAction; | import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkAction; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkActionSupport; |  | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.dao.LmsSetupDAO; | import ch.ethz.seb.sebserver.webservice.servicelayer.dao.LmsSetupDAO; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.dao.ResourceNotFoundException; | import ch.ethz.seb.sebserver.webservice.servicelayer.dao.ResourceNotFoundException; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.dao.TransactionHandler; | import ch.ethz.seb.sebserver.webservice.servicelayer.dao.TransactionHandler; | ||||||
| 
 | 
 | ||||||
| @Lazy | @Lazy | ||||||
| @Component | @Component | ||||||
| public class LmsSetupDAOImpl implements LmsSetupDAO, BulkActionSupport { | public class LmsSetupDAOImpl implements LmsSetupDAO { | ||||||
| 
 |  | ||||||
|     private static final Logger log = LoggerFactory.getLogger(LmsSetupDAOImpl.class); |  | ||||||
| 
 | 
 | ||||||
|     private final LmsSetupRecordMapper lmsSetupRecordMapper; |     private final LmsSetupRecordMapper lmsSetupRecordMapper; | ||||||
| 
 | 
 | ||||||
|  | @ -105,9 +97,15 @@ public class LmsSetupDAOImpl implements LmsSetupDAO, BulkActionSupport { | ||||||
|             final String _lmsType = (lmsType != null) ? lmsType.name() : null; |             final String _lmsType = (lmsType != null) ? lmsType.name() : null; | ||||||
|             return this.lmsSetupRecordMapper |             return this.lmsSetupRecordMapper | ||||||
|                     .selectByExample() |                     .selectByExample() | ||||||
|                     .where(LmsSetupRecordDynamicSqlSupport.institutionId, isEqualToWhenPresent(institutionId)) |                     .where( | ||||||
|                     .and(LmsSetupRecordDynamicSqlSupport.name, isLikeWhenPresent(toSQLWildcard(name))) |                             LmsSetupRecordDynamicSqlSupport.institutionId, | ||||||
|                     .and(LmsSetupRecordDynamicSqlSupport.lmsType, isEqualToWhenPresent(_lmsType)) |                             isEqualToWhenPresent(institutionId)) | ||||||
|  |                     .and( | ||||||
|  |                             LmsSetupRecordDynamicSqlSupport.name, | ||||||
|  |                             isLikeWhenPresent(toSQLWildcard(name))) | ||||||
|  |                     .and( | ||||||
|  |                             LmsSetupRecordDynamicSqlSupport.lmsType, | ||||||
|  |                             isEqualToWhenPresent(_lmsType)) | ||||||
|                     .and( |                     .and( | ||||||
|                             LmsSetupRecordDynamicSqlSupport.active, |                             LmsSetupRecordDynamicSqlSupport.active, | ||||||
|                             isEqualToWhenPresent(BooleanUtils.toIntegerObject(active))) |                             isEqualToWhenPresent(BooleanUtils.toIntegerObject(active))) | ||||||
|  | @ -139,9 +137,7 @@ public class LmsSetupDAOImpl implements LmsSetupDAO, BulkActionSupport { | ||||||
|     @Override |     @Override | ||||||
|     @Transactional |     @Transactional | ||||||
|     public Collection<Result<EntityKey>> setActive(final Set<EntityKey> all, final boolean active) { |     public Collection<Result<EntityKey>> setActive(final Set<EntityKey> all, final boolean active) { | ||||||
|         final Collection<Result<EntityKey>> result = new ArrayList<>(); |         final List<Long> ids = extractIdsFromKeys(all); | ||||||
| 
 |  | ||||||
|         final List<Long> ids = extractIdsFromKeys(all, result); |  | ||||||
|         final LmsSetupRecord lmsSetupRecord = new LmsSetupRecord( |         final LmsSetupRecord lmsSetupRecord = new LmsSetupRecord( | ||||||
|                 null, null, null, null, null, null, null, null, null, null, |                 null, null, null, null, null, null, null, null, null, null, | ||||||
|                 BooleanUtils.toIntegerObject(active)); |                 BooleanUtils.toIntegerObject(active)); | ||||||
|  | @ -166,9 +162,7 @@ public class LmsSetupDAOImpl implements LmsSetupDAO, BulkActionSupport { | ||||||
|     @Override |     @Override | ||||||
|     @Transactional |     @Transactional | ||||||
|     public Collection<Result<EntityKey>> delete(final Set<EntityKey> all) { |     public Collection<Result<EntityKey>> delete(final Set<EntityKey> all) { | ||||||
|         final Collection<Result<EntityKey>> result = new ArrayList<>(); |         final List<Long> ids = extractIdsFromKeys(all); | ||||||
| 
 |  | ||||||
|         final List<Long> ids = extractIdsFromKeys(all, result); |  | ||||||
| 
 | 
 | ||||||
|         try { |         try { | ||||||
|             this.lmsSetupRecordMapper.deleteByExample() |             this.lmsSetupRecordMapper.deleteByExample() | ||||||
|  | @ -192,23 +186,7 @@ public class LmsSetupDAOImpl implements LmsSetupDAO, BulkActionSupport { | ||||||
|     public Set<EntityKey> getDependencies(final BulkAction bulkAction) { |     public Set<EntityKey> getDependencies(final BulkAction bulkAction) { | ||||||
|         // all of institution |         // all of institution | ||||||
|         if (bulkAction.sourceType == EntityType.INSTITUTION) { |         if (bulkAction.sourceType == EntityType.INSTITUTION) { | ||||||
|             final Set<EntityKey> result = new HashSet<>(); |             return getDependencies(bulkAction, this::allIdsOfInstitution); | ||||||
|             for (final EntityKey sourceKey : bulkAction.sources) { |  | ||||||
|                 try { |  | ||||||
|                     result.addAll(this.lmsSetupRecordMapper.selectIdsByExample() |  | ||||||
|                             .where(LmsSetupRecordDynamicSqlSupport.institutionId, |  | ||||||
|                                     isEqualTo(Long.valueOf(sourceKey.entityId))) |  | ||||||
|                             .build() |  | ||||||
|                             .execute() |  | ||||||
|                             .stream() |  | ||||||
|                             .map(id -> new EntityKey(id, EntityType.LMS_SETUP)) |  | ||||||
|                             .collect(Collectors.toList())); |  | ||||||
|                 } catch (final Exception e) { |  | ||||||
|                     log.error("Unexpected error: ", e); |  | ||||||
|                     return Collections.emptySet(); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             return result; |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return Collections.emptySet(); |         return Collections.emptySet(); | ||||||
|  | @ -216,10 +194,9 @@ public class LmsSetupDAOImpl implements LmsSetupDAO, BulkActionSupport { | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     @Transactional(readOnly = true) |     @Transactional(readOnly = true) | ||||||
|     public Result<Collection<Entity>> bulkLoadEntities(final Collection<EntityKey> keys) { |     public Result<Collection<LmsSetup>> bulkLoadEntities(final Collection<EntityKey> keys) { | ||||||
|         return Result.tryCatch(() -> { |         return Result.tryCatch(() -> { | ||||||
|             final Collection<Result<EntityKey>> result = new ArrayList<>(); |             final List<Long> ids = extractIdsFromKeys(keys); | ||||||
|             final List<Long> ids = extractIdsFromKeys(keys, result); |  | ||||||
| 
 | 
 | ||||||
|             return this.lmsSetupRecordMapper.selectByExample() |             return this.lmsSetupRecordMapper.selectByExample() | ||||||
|                     .where(LmsSetupRecordDynamicSqlSupport.id, isIn(ids)) |                     .where(LmsSetupRecordDynamicSqlSupport.id, isIn(ids)) | ||||||
|  | @ -232,22 +209,17 @@ public class LmsSetupDAOImpl implements LmsSetupDAO, BulkActionSupport { | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |     private Result<Collection<EntityKey>> allIdsOfInstitution(final EntityKey institutionKey) { | ||||||
|     @Transactional |         return Result.tryCatch(() -> { | ||||||
|     public Collection<Result<EntityKey>> processBulkAction(final BulkAction bulkAction) { |             return this.lmsSetupRecordMapper.selectIdsByExample() | ||||||
|         final Set<EntityKey> all = bulkAction.extractKeys(EntityType.LMS_SETUP); |                     .where(LmsSetupRecordDynamicSqlSupport.institutionId, | ||||||
| 
 |                             isEqualTo(Long.valueOf(institutionKey.entityId))) | ||||||
|         switch (bulkAction.type) { |                     .build() | ||||||
|             case ACTIVATE: |                     .execute() | ||||||
|                 return setActive(all, true); |                     .stream() | ||||||
|             case DEACTIVATE: |                     .map(id -> new EntityKey(id, EntityType.LMS_SETUP)) | ||||||
|                 return setActive(all, false); |                     .collect(Collectors.toList()); | ||||||
|             case HARD_DELETE: |         }); | ||||||
|                 return delete(all); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // should never happen |  | ||||||
|         throw new UnsupportedOperationException("Unsupported Bulk Action: " + bulkAction); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private Result<LmsSetupRecord> recordById(final Long id) { |     private Result<LmsSetupRecord> recordById(final Long id) { | ||||||
|  |  | ||||||
|  | @ -10,7 +10,6 @@ package ch.ethz.seb.sebserver.webservice.servicelayer.dao.impl; | ||||||
| 
 | 
 | ||||||
| import static org.mybatis.dynamic.sql.SqlBuilder.isIn; | import static org.mybatis.dynamic.sql.SqlBuilder.isIn; | ||||||
| 
 | 
 | ||||||
| import java.util.ArrayList; |  | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
|  | @ -181,9 +180,7 @@ public class UserActivityLogDAOImpl implements UserActivityLogDAO { | ||||||
|     @Override |     @Override | ||||||
|     @Transactional |     @Transactional | ||||||
|     public Collection<Result<EntityKey>> delete(final Set<EntityKey> all) { |     public Collection<Result<EntityKey>> delete(final Set<EntityKey> all) { | ||||||
|         final Collection<Result<EntityKey>> result = new ArrayList<>(); |         final List<Long> ids = extractIdsFromKeys(all); | ||||||
| 
 |  | ||||||
|         final List<Long> ids = extractIdsFromKeys(all, result); |  | ||||||
| 
 | 
 | ||||||
|         try { |         try { | ||||||
|             this.userLogRecordMapper.deleteByExample() |             this.userLogRecordMapper.deleteByExample() | ||||||
|  | @ -231,11 +228,14 @@ public class UserActivityLogDAOImpl implements UserActivityLogDAO { | ||||||
| 
 | 
 | ||||||
|             return (institutionId == null) |             return (institutionId == null) | ||||||
|                     ? this.userLogRecordMapper.selectByExample() |                     ? this.userLogRecordMapper.selectByExample() | ||||||
|                             .where(UserActivityLogRecordDynamicSqlSupport.userUuid, |                             .where( | ||||||
|  |                                     UserActivityLogRecordDynamicSqlSupport.userUuid, | ||||||
|                                     SqlBuilder.isEqualToWhenPresent(userId)) |                                     SqlBuilder.isEqualToWhenPresent(userId)) | ||||||
|                             .and(UserActivityLogRecordDynamicSqlSupport.timestamp, |                             .and( | ||||||
|  |                                     UserActivityLogRecordDynamicSqlSupport.timestamp, | ||||||
|                                     SqlBuilder.isGreaterThanOrEqualToWhenPresent(from)) |                                     SqlBuilder.isGreaterThanOrEqualToWhenPresent(from)) | ||||||
|                             .and(UserActivityLogRecordDynamicSqlSupport.timestamp, |                             .and( | ||||||
|  |                                     UserActivityLogRecordDynamicSqlSupport.timestamp, | ||||||
|                                     SqlBuilder.isLessThanWhenPresent(to)) |                                     SqlBuilder.isLessThanWhenPresent(to)) | ||||||
|                             .build() |                             .build() | ||||||
|                             .execute() |                             .execute() | ||||||
|  | @ -247,15 +247,20 @@ public class UserActivityLogDAOImpl implements UserActivityLogDAO { | ||||||
| 
 | 
 | ||||||
|                     : this.userLogRecordMapper.selectByExample() |                     : this.userLogRecordMapper.selectByExample() | ||||||
|                             .join(UserRecordDynamicSqlSupport.userRecord) |                             .join(UserRecordDynamicSqlSupport.userRecord) | ||||||
|                             .on(UserRecordDynamicSqlSupport.uuid, |                             .on( | ||||||
|  |                                     UserRecordDynamicSqlSupport.uuid, | ||||||
|                                     SqlBuilder.equalTo(UserActivityLogRecordDynamicSqlSupport.userUuid)) |                                     SqlBuilder.equalTo(UserActivityLogRecordDynamicSqlSupport.userUuid)) | ||||||
|                             .where(UserActivityLogRecordDynamicSqlSupport.userUuid, |                             .where( | ||||||
|  |                                     UserActivityLogRecordDynamicSqlSupport.userUuid, | ||||||
|                                     SqlBuilder.isEqualToWhenPresent(userId)) |                                     SqlBuilder.isEqualToWhenPresent(userId)) | ||||||
|                             .and(UserRecordDynamicSqlSupport.institutionId, |                             .and( | ||||||
|  |                                     UserRecordDynamicSqlSupport.institutionId, | ||||||
|                                     SqlBuilder.isEqualToWhenPresent(institutionId)) |                                     SqlBuilder.isEqualToWhenPresent(institutionId)) | ||||||
|                             .and(UserActivityLogRecordDynamicSqlSupport.timestamp, |                             .and( | ||||||
|  |                                     UserActivityLogRecordDynamicSqlSupport.timestamp, | ||||||
|                                     SqlBuilder.isGreaterThanOrEqualToWhenPresent(from)) |                                     SqlBuilder.isGreaterThanOrEqualToWhenPresent(from)) | ||||||
|                             .and(UserActivityLogRecordDynamicSqlSupport.timestamp, |                             .and( | ||||||
|  |                                     UserActivityLogRecordDynamicSqlSupport.timestamp, | ||||||
|                                     SqlBuilder.isLessThanWhenPresent(to)) |                                     SqlBuilder.isLessThanWhenPresent(to)) | ||||||
|                             .build() |                             .build() | ||||||
|                             .execute() |                             .execute() | ||||||
|  | @ -295,7 +300,8 @@ public class UserActivityLogDAOImpl implements UserActivityLogDAO { | ||||||
|     public Result<Integer> overwriteUserReferences(final String userUuid, final boolean deactivate) { |     public Result<Integer> overwriteUserReferences(final String userUuid, final boolean deactivate) { | ||||||
|         return Result.tryCatch(() -> { |         return Result.tryCatch(() -> { | ||||||
|             final List<UserActivityLogRecord> records = this.userLogRecordMapper.selectByExample() |             final List<UserActivityLogRecord> records = this.userLogRecordMapper.selectByExample() | ||||||
|                     .where(UserActivityLogRecordDynamicSqlSupport.userUuid, |                     .where( | ||||||
|  |                             UserActivityLogRecordDynamicSqlSupport.userUuid, | ||||||
|                             SqlBuilder.isEqualTo(userUuid)) |                             SqlBuilder.isEqualTo(userUuid)) | ||||||
|                     .build() |                     .build() | ||||||
|                     .execute(); |                     .execute(); | ||||||
|  | @ -317,7 +323,8 @@ public class UserActivityLogDAOImpl implements UserActivityLogDAO { | ||||||
|     public Result<Integer> deleteUserEnities(final String userUuid) { |     public Result<Integer> deleteUserEnities(final String userUuid) { | ||||||
|         return Result.tryCatch(() -> { |         return Result.tryCatch(() -> { | ||||||
|             return this.userLogRecordMapper.deleteByExample() |             return this.userLogRecordMapper.deleteByExample() | ||||||
|                     .where(UserActivityLogRecordDynamicSqlSupport.userUuid, |                     .where( | ||||||
|  |                             UserActivityLogRecordDynamicSqlSupport.userUuid, | ||||||
|                             SqlBuilder.isEqualToWhenPresent(userUuid)) |                             SqlBuilder.isEqualToWhenPresent(userUuid)) | ||||||
|                     .build() |                     .build() | ||||||
|                     .execute(); |                     .execute(); | ||||||
|  |  | ||||||
|  | @ -11,10 +11,8 @@ package ch.ethz.seb.sebserver.webservice.servicelayer.dao.impl; | ||||||
| import static ch.ethz.seb.sebserver.gbl.util.Utils.toSQLWildcard; | import static ch.ethz.seb.sebserver.gbl.util.Utils.toSQLWildcard; | ||||||
| import static org.mybatis.dynamic.sql.SqlBuilder.*; | import static org.mybatis.dynamic.sql.SqlBuilder.*; | ||||||
| 
 | 
 | ||||||
| import java.util.ArrayList; |  | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| import java.util.Collections; | import java.util.Collections; | ||||||
| import java.util.HashSet; |  | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Locale; | import java.util.Locale; | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
|  | @ -39,7 +37,6 @@ import org.springframework.transaction.annotation.Transactional; | ||||||
| import ch.ethz.seb.sebserver.WebSecurityConfig; | import ch.ethz.seb.sebserver.WebSecurityConfig; | ||||||
| import ch.ethz.seb.sebserver.gbl.model.APIMessage.APIMessageException; | import ch.ethz.seb.sebserver.gbl.model.APIMessage.APIMessageException; | ||||||
| import ch.ethz.seb.sebserver.gbl.model.APIMessage.ErrorMessage; | import ch.ethz.seb.sebserver.gbl.model.APIMessage.ErrorMessage; | ||||||
| import ch.ethz.seb.sebserver.gbl.model.Entity; |  | ||||||
| import ch.ethz.seb.sebserver.gbl.model.EntityKey; | import ch.ethz.seb.sebserver.gbl.model.EntityKey; | ||||||
| import ch.ethz.seb.sebserver.gbl.model.EntityType; | import ch.ethz.seb.sebserver.gbl.model.EntityType; | ||||||
| import ch.ethz.seb.sebserver.gbl.model.user.UserFilter; | import ch.ethz.seb.sebserver.gbl.model.user.UserFilter; | ||||||
|  | @ -55,13 +52,12 @@ import ch.ethz.seb.sebserver.webservice.datalayer.batis.model.RoleRecord; | ||||||
| import ch.ethz.seb.sebserver.webservice.datalayer.batis.model.UserRecord; | import ch.ethz.seb.sebserver.webservice.datalayer.batis.model.UserRecord; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.authorization.SEBServerUser; | import ch.ethz.seb.sebserver.webservice.servicelayer.authorization.SEBServerUser; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkAction; | import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkAction; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkActionSupport; |  | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.dao.TransactionHandler; | import ch.ethz.seb.sebserver.webservice.servicelayer.dao.TransactionHandler; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.dao.UserDAO; | import ch.ethz.seb.sebserver.webservice.servicelayer.dao.UserDAO; | ||||||
| 
 | 
 | ||||||
| @Lazy | @Lazy | ||||||
| @Component | @Component | ||||||
| public class UserDaoImpl implements UserDAO, BulkActionSupport { | public class UserDaoImpl implements UserDAO { | ||||||
| 
 | 
 | ||||||
|     private static final Logger log = LoggerFactory.getLogger(UserDaoImpl.class); |     private static final Logger log = LoggerFactory.getLogger(UserDaoImpl.class); | ||||||
|     private static final UserFilter ALL_ACTIVE_ONLY_FILTER = new UserFilter(null, null, null, null, true, null); |     private static final UserFilter ALL_ACTIVE_ONLY_FILTER = new UserFilter(null, null, null, null, true, null); | ||||||
|  | @ -195,9 +191,7 @@ public class UserDaoImpl implements UserDAO, BulkActionSupport { | ||||||
|     @Override |     @Override | ||||||
|     @Transactional |     @Transactional | ||||||
|     public Collection<Result<EntityKey>> setActive(final Set<EntityKey> all, final boolean active) { |     public Collection<Result<EntityKey>> setActive(final Set<EntityKey> all, final boolean active) { | ||||||
|         final Collection<Result<EntityKey>> result = new ArrayList<>(); |         final List<Long> ids = extractIdsFromKeys(all); | ||||||
| 
 |  | ||||||
|         final List<Long> ids = extractIdsFromKeys(all, result); |  | ||||||
|         final UserRecord userRecord = new UserRecord( |         final UserRecord userRecord = new UserRecord( | ||||||
|                 null, null, null, null, null, null, null, null, null, |                 null, null, null, null, null, null, null, null, null, | ||||||
|                 BooleanUtils.toIntegerObject(active)); |                 BooleanUtils.toIntegerObject(active)); | ||||||
|  | @ -222,9 +216,7 @@ public class UserDaoImpl implements UserDAO, BulkActionSupport { | ||||||
|     @Override |     @Override | ||||||
|     @Transactional |     @Transactional | ||||||
|     public Collection<Result<EntityKey>> delete(final Set<EntityKey> all) { |     public Collection<Result<EntityKey>> delete(final Set<EntityKey> all) { | ||||||
|         final Collection<Result<EntityKey>> result = new ArrayList<>(); |         final List<Long> ids = extractIdsFromKeys(all); | ||||||
| 
 |  | ||||||
|         final List<Long> ids = extractIdsFromKeys(all, result); |  | ||||||
| 
 | 
 | ||||||
|         try { |         try { | ||||||
|             this.userRecordMapper.deleteByExample() |             this.userRecordMapper.deleteByExample() | ||||||
|  | @ -245,9 +237,9 @@ public class UserDaoImpl implements UserDAO, BulkActionSupport { | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     @Transactional(readOnly = true) |     @Transactional(readOnly = true) | ||||||
|     public Collection<EntityKey> getAllUserData(final String uuid) { |     public Collection<EntityKey> getAllUserRelatedData(final String uuid) { | ||||||
| 
 | 
 | ||||||
|         // TODO |         // TODO get | ||||||
| 
 | 
 | ||||||
|         return Collections.emptyList(); |         return Collections.emptyList(); | ||||||
|     } |     } | ||||||
|  | @ -257,23 +249,7 @@ public class UserDaoImpl implements UserDAO, BulkActionSupport { | ||||||
|     public Set<EntityKey> getDependencies(final BulkAction bulkAction) { |     public Set<EntityKey> getDependencies(final BulkAction bulkAction) { | ||||||
|         // all of institution |         // all of institution | ||||||
|         if (bulkAction.sourceType == EntityType.INSTITUTION) { |         if (bulkAction.sourceType == EntityType.INSTITUTION) { | ||||||
|             final Set<EntityKey> result = new HashSet<>(); |             return getDependencies(bulkAction, this::allIdsOfInstitution); | ||||||
|             for (final EntityKey sourceKey : bulkAction.sources) { |  | ||||||
|                 try { |  | ||||||
|                     result.addAll(this.userRecordMapper.selectIdsByExample() |  | ||||||
|                             .where(UserRecordDynamicSqlSupport.institutionId, |  | ||||||
|                                     isEqualTo(Long.valueOf(sourceKey.entityId))) |  | ||||||
|                             .build() |  | ||||||
|                             .execute() |  | ||||||
|                             .stream() |  | ||||||
|                             .map(id -> new EntityKey(id, EntityType.LMS_SETUP)) |  | ||||||
|                             .collect(Collectors.toList())); |  | ||||||
|                 } catch (final Exception e) { |  | ||||||
|                     log.error("Unexpected error: ", e); |  | ||||||
|                     return Collections.emptySet(); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             return result; |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return Collections.emptySet(); |         return Collections.emptySet(); | ||||||
|  | @ -281,10 +257,9 @@ public class UserDaoImpl implements UserDAO, BulkActionSupport { | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     @Transactional(readOnly = true) |     @Transactional(readOnly = true) | ||||||
|     public Result<Collection<Entity>> bulkLoadEntities(final Collection<EntityKey> keys) { |     public Result<Collection<UserInfo>> bulkLoadEntities(final Collection<EntityKey> keys) { | ||||||
|         return Result.tryCatch(() -> { |         return Result.tryCatch(() -> { | ||||||
|             final Collection<Result<EntityKey>> result = new ArrayList<>(); |             final List<Long> ids = extractIdsFromKeys(keys); | ||||||
|             final List<Long> ids = extractIdsFromKeys(keys, result); |  | ||||||
| 
 | 
 | ||||||
|             return this.userRecordMapper.selectByExample() |             return this.userRecordMapper.selectByExample() | ||||||
|                     .where(InstitutionRecordDynamicSqlSupport.id, isIn(ids)) |                     .where(InstitutionRecordDynamicSqlSupport.id, isIn(ids)) | ||||||
|  | @ -298,40 +273,21 @@ public class UserDaoImpl implements UserDAO, BulkActionSupport { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     @Transactional |     public List<Long> extractIdsFromKeys(final Collection<EntityKey> keys) { | ||||||
|     public Collection<Result<EntityKey>> processBulkAction(final BulkAction bulkAction) { |  | ||||||
|         final Set<EntityKey> all = bulkAction.extractKeys(EntityType.USER); |  | ||||||
| 
 |  | ||||||
|         switch (bulkAction.type) { |  | ||||||
|             case ACTIVATE: |  | ||||||
|                 return setActive(all, true); |  | ||||||
|             case DEACTIVATE: |  | ||||||
|                 return setActive(all, false); |  | ||||||
|             case HARD_DELETE: |  | ||||||
|                 return delete(all); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // should never happen |  | ||||||
|         throw new UnsupportedOperationException("Unsupported Bulk Action: " + bulkAction); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     @Override |  | ||||||
|     public List<Long> extractIdsFromKeys( |  | ||||||
|             final Collection<EntityKey> keys, |  | ||||||
|             final Collection<Result<EntityKey>> result) { |  | ||||||
| 
 |  | ||||||
|         if (keys == null || keys.isEmpty() || keys.iterator().next().isIdPK) { |         if (keys == null || keys.isEmpty() || keys.iterator().next().isIdPK) { | ||||||
|             return UserDAO.super.extractIdsFromKeys(keys, result); |             return UserDAO.super.extractIdsFromKeys(keys); | ||||||
|         } else { |         } else { | ||||||
|             final List<String> uuids = keys.stream() |             final List<String> uuids = keys.stream() | ||||||
|                     .map(key -> key.entityId) |                     .map(key -> key.entityId) | ||||||
|                     .collect(Collectors.toList()); |                     .collect(Collectors.toList()); | ||||||
| 
 | 
 | ||||||
|             try { |             try { | ||||||
|  | 
 | ||||||
|                 return this.userRecordMapper.selectIdsByExample() |                 return this.userRecordMapper.selectIdsByExample() | ||||||
|                         .where(UserRecordDynamicSqlSupport.uuid, isIn(uuids)) |                         .where(UserRecordDynamicSqlSupport.uuid, isIn(uuids)) | ||||||
|                         .build() |                         .build() | ||||||
|                         .execute(); |                         .execute(); | ||||||
|  | 
 | ||||||
|             } catch (final Exception e) { |             } catch (final Exception e) { | ||||||
|                 log.error("Unexpected error: ", e); |                 log.error("Unexpected error: ", e); | ||||||
|                 return Collections.emptyList(); |                 return Collections.emptyList(); | ||||||
|  | @ -339,6 +295,19 @@ public class UserDaoImpl implements UserDAO, BulkActionSupport { | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     private Result<Collection<EntityKey>> allIdsOfInstitution(final EntityKey institutionKey) { | ||||||
|  |         return Result.tryCatch(() -> { | ||||||
|  |             return this.userRecordMapper.selectIdsByExample() | ||||||
|  |                     .where(UserRecordDynamicSqlSupport.institutionId, | ||||||
|  |                             isEqualTo(Long.valueOf(institutionKey.entityId))) | ||||||
|  |                     .build() | ||||||
|  |                     .execute() | ||||||
|  |                     .stream() | ||||||
|  |                     .map(id -> new EntityKey(id, EntityType.USER)) | ||||||
|  |                     .collect(Collectors.toList()); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     private Result<UserRecord> updateUser(final UserMod userMod) { |     private Result<UserRecord> updateUser(final UserMod userMod) { | ||||||
|         return recordByUUID(userMod.uuid) |         return recordByUUID(userMod.uuid) | ||||||
|                 .map(record -> { |                 .map(record -> { | ||||||
|  |  | ||||||
|  | @ -17,4 +17,8 @@ public interface LmsAPIService { | ||||||
| 
 | 
 | ||||||
|     Result<LmsAPITemplate> createLmsAPITemplate(LmsSetup lmsSetup); |     Result<LmsAPITemplate> createLmsAPITemplate(LmsSetup lmsSetup); | ||||||
| 
 | 
 | ||||||
|  |     Result<byte[]> createSEBStartConfiguration(Long lmsSetupId); | ||||||
|  | 
 | ||||||
|  |     Result<byte[]> createSEBStartConfiguration(LmsSetup lmsSetup); | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -45,4 +45,25 @@ public class LmsAPIServiceImpl implements LmsAPIService { | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     @Override | ||||||
|  |     public Result<byte[]> createSEBStartConfiguration(final Long lmsSetupId) { | ||||||
|  |         return this.lmsSetupDAO | ||||||
|  |                 .byId(lmsSetupId) | ||||||
|  |                 .flatMap(this::createSEBStartConfiguration); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public Result<byte[]> createSEBStartConfiguration(final LmsSetup lmsSetup) { | ||||||
|  | 
 | ||||||
|  |         // TODO implementation of creation of SEB start configuration for specified LmsSetup | ||||||
|  |         // A SEB start configuration should at least contain the SEB-Client-Credentials to access the SEB Server API | ||||||
|  |         // and the SEB Server URL | ||||||
|  |         // | ||||||
|  |         // To Clarify : The format of a SEB start configuration | ||||||
|  |         // To Clarify : How the file should be encrypted (use case) maybe we need another encryption-secret for this that can be given by | ||||||
|  |         //              an administrator on SEB start configuration creation time | ||||||
|  | 
 | ||||||
|  |         return Result.ofTODO(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -13,6 +13,7 @@ import java.util.stream.Collectors; | ||||||
| 
 | 
 | ||||||
| import javax.validation.Valid; | import javax.validation.Valid; | ||||||
| 
 | 
 | ||||||
|  | import org.springframework.http.MediaType; | ||||||
| import org.springframework.web.bind.annotation.PathVariable; | import org.springframework.web.bind.annotation.PathVariable; | ||||||
| import org.springframework.web.bind.annotation.RequestBody; | import org.springframework.web.bind.annotation.RequestBody; | ||||||
| import org.springframework.web.bind.annotation.RequestMapping; | import org.springframework.web.bind.annotation.RequestMapping; | ||||||
|  | @ -38,6 +39,7 @@ import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkActionServic | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.dao.LmsSetupDAO; | import ch.ethz.seb.sebserver.webservice.servicelayer.dao.LmsSetupDAO; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.dao.UserActivityLogDAO; | import ch.ethz.seb.sebserver.webservice.servicelayer.dao.UserActivityLogDAO; | ||||||
| import ch.ethz.seb.sebserver.webservice.servicelayer.dao.UserActivityLogDAO.ActivityType; | import ch.ethz.seb.sebserver.webservice.servicelayer.dao.UserActivityLogDAO.ActivityType; | ||||||
|  | import ch.ethz.seb.sebserver.webservice.servicelayer.lms.LmsAPIService; | ||||||
| 
 | 
 | ||||||
| @WebServiceProfile | @WebServiceProfile | ||||||
| @RestController | @RestController | ||||||
|  | @ -48,17 +50,20 @@ public class LmsSetupController { | ||||||
|     private final AuthorizationGrantService authorizationGrantService; |     private final AuthorizationGrantService authorizationGrantService; | ||||||
|     private final UserActivityLogDAO userActivityLogDAO; |     private final UserActivityLogDAO userActivityLogDAO; | ||||||
|     private final BulkActionService bulkActionService; |     private final BulkActionService bulkActionService; | ||||||
|  |     private final LmsAPIService lmsAPIService; | ||||||
| 
 | 
 | ||||||
|     public LmsSetupController( |     public LmsSetupController( | ||||||
|             final LmsSetupDAO lmsSetupDAO, |             final LmsSetupDAO lmsSetupDAO, | ||||||
|             final AuthorizationGrantService authorizationGrantService, |             final AuthorizationGrantService authorizationGrantService, | ||||||
|             final UserActivityLogDAO userActivityLogDAO, |             final UserActivityLogDAO userActivityLogDAO, | ||||||
|             final BulkActionService bulkActionService) { |             final BulkActionService bulkActionService, | ||||||
|  |             final LmsAPIService lmsAPIService) { | ||||||
| 
 | 
 | ||||||
|         this.lmsSetupDAO = lmsSetupDAO; |         this.lmsSetupDAO = lmsSetupDAO; | ||||||
|         this.authorizationGrantService = authorizationGrantService; |         this.authorizationGrantService = authorizationGrantService; | ||||||
|         this.userActivityLogDAO = userActivityLogDAO; |         this.userActivityLogDAO = userActivityLogDAO; | ||||||
|         this.bulkActionService = bulkActionService; |         this.bulkActionService = bulkActionService; | ||||||
|  |         this.lmsAPIService = lmsAPIService; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @RequestMapping(method = RequestMethod.GET) |     @RequestMapping(method = RequestMethod.GET) | ||||||
|  | @ -118,6 +123,21 @@ public class LmsSetupController { | ||||||
|                 .getOrThrow(); |                 .getOrThrow(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     @RequestMapping( | ||||||
|  |             path = "/create_seb_config/{id}", | ||||||
|  |             method = RequestMethod.GET, | ||||||
|  |             produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) // TODO check if this is the right format | ||||||
|  |     public byte[] createSEBConfig(@PathVariable final Long id) { | ||||||
|  | 
 | ||||||
|  |         this.authorizationGrantService.checkHasAnyPrivilege( | ||||||
|  |                 EntityType.LMS_SETUP, | ||||||
|  |                 PrivilegeType.WRITE); | ||||||
|  | 
 | ||||||
|  |         return this.lmsAPIService | ||||||
|  |                 .createSEBStartConfiguration(id) | ||||||
|  |                 .getOrThrow(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     @RequestMapping(path = "/create", method = RequestMethod.PUT) |     @RequestMapping(path = "/create", method = RequestMethod.PUT) | ||||||
|     public LmsSetup create(@Valid @RequestBody final LmsSetup lmsSetup) { |     public LmsSetup create(@Valid @RequestBody final LmsSetup lmsSetup) { | ||||||
|         return save(lmsSetup, PrivilegeType.WRITE) |         return save(lmsSetup, PrivilegeType.WRITE) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 anhefti
						anhefti