/* Copyright 2014 Danish Maritime Authority.
*
* Licensed 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 net.maritimecloud.serviceregistry.command.organization;
import net.maritimecloud.serviceregistry.command.api.PrepareServiceSpecification;
import net.maritimecloud.serviceregistry.command.api.ProvideServiceInstance;
import javax.annotation.Resource;
import net.maritimecloud.serviceregistry.command.api.AuthorizeMembershipToOrganizationCreator;
import net.maritimecloud.serviceregistry.command.api.InviteUserToOrganization;
import net.maritimecloud.serviceregistry.command.api.ApplyForMembershipToOrganization;
import net.maritimecloud.serviceregistry.command.organization.membership.Membership;
import net.maritimecloud.serviceregistry.command.serviceinstance.ServiceInstance;
import net.maritimecloud.serviceregistry.command.servicespecification.ServiceSpecification;
import net.maritimecloud.serviceregistry.query.OrganizationMembershipQueryRepository;
import org.axonframework.commandhandling.annotation.CommandHandler;
import org.axonframework.repository.Repository;
import org.springframework.stereotype.Component;
/**
* Responsibilities (in the ServiceRegistry context):
* <p>
* <p>
* Creates ServiceSpecifications and provides ServiceInstances (Provides factories for ServiceSpecifications and ServiceInstances, this
* protects the invariant that )
* <p>
* Makes sure that ServiceSpecifications and ServiceInstances has a unique identity within the owning organization
* <p>
* Maintains the lists of ServiceSpecifications and ServiceInstances held by an organization
* <p>
* <p>
* @author Christoffer Børrild
*/
@Component
public class OrganizationCommandHandler {
@Resource
private Repository<Organization> repository;
@Resource
private Repository<ServiceSpecification> serviceSpecificationRepository;
@Resource
private Repository<ServiceInstance> serviceInstanceRepository;
@Resource
private Repository<Membership> membershipRepository;
// HACK! TODO: probably should NOT be using a view-model from a command context!
@Resource
OrganizationMembershipQueryRepository membershipQueryRepository;
public void setOrganizationRepository(Repository<Organization> organizationRepository) {
this.repository = organizationRepository;
}
public void setServiceSpecificationRepository(Repository<ServiceSpecification> serviceSpecificationRepository) {
this.serviceSpecificationRepository = serviceSpecificationRepository;
}
public void setServiceInstanceRepository(Repository<ServiceInstance> serviceInstanceRepository) {
this.serviceInstanceRepository = serviceInstanceRepository;
}
public void setMembershipRepository(Repository<Membership> membershipRepository) {
this.membershipRepository = membershipRepository;
}
public void setMembershipQueryRepository(OrganizationMembershipQueryRepository membershipQueryRepository) {
this.membershipQueryRepository = membershipQueryRepository;
}
@CommandHandler
public void handle(AuthorizeMembershipToOrganizationCreator command) {
Organization organization = repository.load(command.getOrganizationId());
if (organization.isDeleted()) {
throw new IllegalArgumentException("Organization exists no more. " + command.getOrganizationId());
}
Membership membership = new Membership(
command.getMembershipId(),
command.getOrganizationId(),
command.getUsername(),
"",
Membership.ApplicationType.CREATOR
);
membershipRepository.add(membership);
}
@CommandHandler
public void handle(InviteUserToOrganization command) {
Organization organization = repository.load(command.getOrganizationId());
if (organization.isDeleted()) {
throw new IllegalArgumentException("Organization exists no more. " + command.getOrganizationId());
}
if (isAlreadyAMember(command.getOrganizationId(), command.getUsername())) {
// dublicate registration - just ignore
return;
}
Membership membership = new Membership(
command.getMembershipId(),
command.getOrganizationId(),
command.getUsername(),
"",
Membership.ApplicationType.INVITE
);
membershipRepository.add(membership);
}
@CommandHandler
public void handle(ApplyForMembershipToOrganization command) {
Organization organization = repository.load(command.getOrganizationId());
if (organization.isDeleted()) {
throw new IllegalArgumentException("Organization exists no more. " + command.getOrganizationId());
}
if (isAlreadyAMember(command.getOrganizationId(), command.getUsername())) {
// dublicate registration - just ignore
return;
}
Membership membership = new Membership(
command.getMembershipId(),
command.getOrganizationId(),
command.getUsername(),
command.getApplicationMessage(),
Membership.ApplicationType.APPLICATION
);
membershipRepository.add(membership);
}
private boolean isAlreadyAMember(OrganizationId organizationId, String username) {
// (HACK: probably should NOT be using a public query-model for this verification)
return membershipQueryRepository.findByOrganizationIdAndUsername(organizationId.identifier(), username) != null;
}
@CommandHandler
public void handle(PrepareServiceSpecification command) {
Organization organization = repository.load(command.getOwnerId());
if (organization.isDeleted()) {
throw new IllegalArgumentException("Organization exists no more. " + command.getOwnerId());
}
ServiceSpecification serviceSpecification
= organization.prepareServiceSpecification(command.getServiceSpecificationId(), command.getServiceType(), command.getName(), command.getSummary());
serviceSpecificationRepository.add(serviceSpecification);
}
@CommandHandler
public void handle(ProvideServiceInstance command) {
Organization organization = repository.load(command.getProviderId());
if (organization.isDeleted()) {
throw new IllegalArgumentException("Organization exists no more. " + command.getProviderId());
}
ServiceSpecification serviceSpecification
= serviceSpecificationRepository.load(command.getSpecificationId());
if (serviceSpecification.isDeleted()) {
throw new IllegalArgumentException("Service specification exists no more. " + command.getProviderId());
}
ServiceInstance serviceInstance
= organization.provideServiceInstance(
serviceSpecification,
command.getServiceInstanceId(),
command.getName(),
command.getSummary(),
command.getCoverage()
);
serviceInstanceRepository.add(serviceInstance);
}
}