/** * * Copyright * 2009-2015 Jayway Products AB * 2016-2017 Föreningen Sambruk * * Licensed under AGPL, Version 3.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.gnu.org/licenses/agpl.txt * * 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 se.streamsource.streamflow.web.domain.structure.organization; import org.qi4j.api.common.Optional; import org.qi4j.api.concern.ConcernOf; import org.qi4j.api.concern.Concerns; import org.qi4j.api.injection.scope.Service; import org.qi4j.api.injection.scope.This; import org.qi4j.api.mixin.Mixins; import se.streamsource.streamflow.web.domain.entity.caze.CaseEntity; import se.streamsource.streamflow.web.domain.entity.gtd.Drafts; import se.streamsource.streamflow.web.domain.entity.project.ProjectEntity; import se.streamsource.streamflow.web.domain.structure.caze.Case; import se.streamsource.streamflow.web.domain.structure.label.Label; import se.streamsource.streamflow.web.domain.structure.label.Labelable; import se.streamsource.streamflow.web.infrastructure.caching.Caches; import se.streamsource.streamflow.web.infrastructure.caching.Caching; import se.streamsource.streamflow.web.infrastructure.caching.CachingService; /** * TODO */ @Concerns(EmailCases.EmailCaseCountCacheConcern.class) @Mixins(EmailCases.Mixin.class) public interface EmailCases { CaseEntity createCase( Drafts endUser ); void sendTo( Case caze ); class Mixin implements EmailCases { @This Labelable.Data labelable; @This AccessPointSettings.Data accesspoint; public CaseEntity createCase( Drafts endUser ) { CaseEntity caseEntity = endUser.createDraft(); if( accesspoint.caseType().get() != null ) { caseEntity.changeDescription( accesspoint.caseType().get().getDescription() ); caseEntity.changeCaseType( accesspoint.caseType().get() ); } caseEntity.accesspoint().set( (EmailAccessPoint) accesspoint ); for (Label label : labelable.labels()) { caseEntity.addLabel( label ); } return caseEntity; } public void sendTo( Case caze ) { CaseEntity caseEntity = (CaseEntity) caze; if (caseEntity.isAssigned()) caseEntity.unassign(); caseEntity.changeOwner( accesspoint.project().get() ); caseEntity.open(); } } abstract class EmailCaseCountCacheConcern extends ConcernOf<EmailCases> implements EmailCases { @This AccessPointSettings.Data accesspoint; Caching caching; public void init(@Optional @Service CachingService cache) { caching = new Caching(cache, Caches.CASECOUNTS); } public void sendTo( Case caze ) { next.sendTo( caze ); // Update inbox cache on receiving end caching.addToCaseCountCache( ((ProjectEntity)accesspoint.project().get()).identity().get(), 1 ); caching.addToUnreadCache( ((ProjectEntity)accesspoint.project().get()).identity().get(), 1 ); } } }