blob: 5a6f2792e6b3b0362b582a4b5635b9f828abc8eb [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package io.mifos.accounting.service.internal.repository;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.SimpleStatement;
import com.datastax.driver.core.Statement;
import com.datastax.driver.core.querybuilder.QueryBuilder;
import com.datastax.driver.mapping.Mapper;
import com.datastax.driver.mapping.Result;
import io.mifos.core.cassandra.core.CassandraSessionProvider;
import io.mifos.core.cassandra.core.TenantAwareCassandraMapperProvider;
import io.mifos.core.cassandra.core.TenantAwareEntityTemplate;
import io.mifos.core.lang.DateConverter;
import io.mifos.core.lang.DateRange;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@SuppressWarnings({"unused"})
@Repository
public class JournalEntryRepository {
private final CassandraSessionProvider cassandraSessionProvider;
private final TenantAwareCassandraMapperProvider tenantAwareCassandraMapperProvider;
private final TenantAwareEntityTemplate tenantAwareEntityTemplate;
@Autowired
public JournalEntryRepository(final CassandraSessionProvider cassandraSessionProvider,
final TenantAwareCassandraMapperProvider tenantAwareCassandraMapperProvider,
final TenantAwareEntityTemplate tenantAwareEntityTemplate) {
super();
this.cassandraSessionProvider = cassandraSessionProvider;
this.tenantAwareCassandraMapperProvider = tenantAwareCassandraMapperProvider;
this.tenantAwareEntityTemplate = tenantAwareEntityTemplate;
}
public void saveJournalEntry(final JournalEntryEntity journalEntryEntity) {
this.tenantAwareEntityTemplate.save(journalEntryEntity);
final JournalEntryLookup journalEntryLookup = new JournalEntryLookup();
journalEntryLookup.setTransactionIdentifier(journalEntryEntity.getTransactionIdentifier());
journalEntryLookup.setDateBucket(journalEntryEntity.getDateBucket());
this.tenantAwareEntityTemplate.save(journalEntryLookup);
}
public List<JournalEntryEntity> fetchJournalEntries(final DateRange range) {
final Session tenantSession = this.cassandraSessionProvider.getTenantSession();
final List<String> datesInBetweenRange
= range.stream()
.map(DateConverter::toIsoString)
.collect(Collectors.toList());
final Statement stmt = new SimpleStatement(
QueryBuilder
.select().all()
.from("thoth_journal_entries")
.where(QueryBuilder.in("date_bucket", datesInBetweenRange)).getQueryString(),
datesInBetweenRange.toArray()
);
final ResultSet resultSet = tenantSession.execute(stmt);
final Mapper<JournalEntryEntity> mapper = this.tenantAwareCassandraMapperProvider.getMapper(JournalEntryEntity.class);
final Result<JournalEntryEntity> journalEntryEntities = mapper.map(resultSet);
return journalEntryEntities.all();
}
public Optional<JournalEntryEntity> findJournalEntry(final String transactionIdentifier) {
final Optional<JournalEntryLookup> optionalJournalEntryLookup = this.tenantAwareEntityTemplate.findById(JournalEntryLookup.class, transactionIdentifier);
if (optionalJournalEntryLookup.isPresent()) {
final JournalEntryLookup journalEntryLookup = optionalJournalEntryLookup.get();
final List<JournalEntryEntity> journalEntryEntities = this.tenantAwareEntityTemplate.fetchByKeys(JournalEntryEntity.class, journalEntryLookup.getDateBucket(),
journalEntryLookup.getTransactionIdentifier());
return Optional.of(journalEntryEntities.get(0));
} else {
return Optional.empty();
}
}
}