package org.apereo.cas.support.events.mongo; import org.apereo.cas.support.events.dao.AbstractCasEventRepository; import org.apereo.cas.support.events.dao.CasEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.util.Assert; import java.time.ZonedDateTime; import java.util.Collection; /** * This is {@link MongoDbCasEventRepository} that stores event data into a mongodb database. * * @author Misagh Moayyed * @since 5.0.0 */ public class MongoDbCasEventRepository extends AbstractCasEventRepository { private static final Logger LOGGER = LoggerFactory.getLogger(MongoDbCasEventRepository.class); private final String collectionName; private final MongoOperations mongoTemplate; public MongoDbCasEventRepository(final MongoOperations mongoTemplate, final String collectionName, final boolean dropCollection) { this.mongoTemplate = mongoTemplate; this.collectionName = collectionName; Assert.notNull(this.mongoTemplate); if (dropCollection) { LOGGER.debug("Dropping database collection: [{}]", this.collectionName); this.mongoTemplate.dropCollection(this.collectionName); } if (!this.mongoTemplate.collectionExists(this.collectionName)) { LOGGER.debug("Creating database collection: [{}]", this.collectionName); this.mongoTemplate.createCollection(this.collectionName); } } @Override public String toString() { return getClass().getSimpleName(); } @Override public void save(final CasEvent event) { this.mongoTemplate.save(event, this.collectionName); } @Override public Collection<CasEvent> load() { return this.mongoTemplate.findAll(CasEvent.class, this.collectionName); } @Override public Collection<CasEvent> getEventsForPrincipal(final String id) { final Query query = new Query(); query.addCriteria(Criteria.where(PRINCIPAL_ID_PARAM).is(id)); return this.mongoTemplate.find(query, CasEvent.class, this.collectionName); } @Override public Collection<CasEvent> getEventsOfType(final String type) { final Query query = new Query(); query.addCriteria(Criteria.where(TYPE_PARAM).is(type)); return this.mongoTemplate.find(query, CasEvent.class, this.collectionName); } @Override public Collection<CasEvent> getEventsOfTypeForPrincipal(final String type, final String principal) { final Query query = new Query(); query.addCriteria(Criteria.where(TYPE_PARAM).is(type).and(PRINCIPAL_ID_PARAM).is(principal)); return this.mongoTemplate.find(query, CasEvent.class, this.collectionName); } @Override public Collection<CasEvent> load(final ZonedDateTime dateTime) { final Query query = new Query(); query.addCriteria(Criteria.where(CREATION_TIME_PARAM).gte(dateTime.toString())); return this.mongoTemplate.find(query, CasEvent.class, this.collectionName); } @Override public Collection<CasEvent> getEventsOfTypeForPrincipal(final String type, final String principal, final ZonedDateTime dateTime) { final Query query = new Query(); query.addCriteria(Criteria.where(TYPE_PARAM).is(type).and(PRINCIPAL_ID_PARAM).is(principal).and(CREATION_TIME_PARAM).gte(dateTime.toString())); return this.mongoTemplate.find(query, CasEvent.class, this.collectionName); } @Override public Collection<CasEvent> getEventsOfType(final String type, final ZonedDateTime dateTime) { final Query query = new Query(); query.addCriteria(Criteria.where(TYPE_PARAM).is(type).and(CREATION_TIME_PARAM).gte(dateTime.toString())); return this.mongoTemplate.find(query, CasEvent.class, this.collectionName); } @Override public Collection<CasEvent> getEventsForPrincipal(final String principal, final ZonedDateTime dateTime) { final Query query = new Query(); query.addCriteria(Criteria.where(PRINCIPAL_ID_PARAM).is(principal).and(CREATION_TIME_PARAM).gte(dateTime.toString())); return this.mongoTemplate.find(query, CasEvent.class, this.collectionName); } }