All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.gravitee.management.service.impl.MembershipServiceImpl Maven / Gradle / Ivy

There is a newer version: 1.30.31
Show newest version
/**
 * Copyright (C) 2015 The Gravitee team (http://gravitee.io)
 *
 * 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 io.gravitee.management.service.impl;

import com.google.common.collect.ImmutableMap;
import io.gravitee.management.model.MemberEntity;
import io.gravitee.management.model.MembershipType;
import io.gravitee.management.model.NewExternalUserEntity;
import io.gravitee.management.model.UserEntity;
import io.gravitee.management.service.*;
import io.gravitee.management.service.builder.EmailNotificationBuilder;
import io.gravitee.management.service.exceptions.NotAuthorizedMembershipException;
import io.gravitee.management.service.exceptions.TechnicalManagementException;
import io.gravitee.management.service.exceptions.UserNotFoundException;
import io.gravitee.repository.exceptions.TechnicalException;
import io.gravitee.repository.management.api.MembershipRepository;
import io.gravitee.repository.management.model.Membership;
import io.gravitee.repository.management.model.MembershipReferenceType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @author Nicolas GERAUD (nicolas.geraud at graviteesource.com)
 * @author GraviteeSource Team
 */
@Component
public class MembershipServiceImpl extends TransactionalService implements MembershipService {

    private final Logger LOGGER = LoggerFactory.getLogger(MembershipServiceImpl.class);

    @Autowired
    private UserService userService;

    @Autowired
    private EmailService emailService;

    @Autowired
    private IdentityService identityService;

    @Autowired
    private MembershipRepository membershipRepository;

    @Override
    public Set getMembers(MembershipReferenceType referenceType, String referenceId) {
        return getMembers(referenceType, referenceId, null);
    }

    @Override
    public Set getMembers(MembershipReferenceType referenceType, String referenceId, MembershipType membershipType) {
        try {
            LOGGER.debug("Get members for {} {}", referenceType, referenceId);

            Set memberships = membershipRepository.findByReferenceAndMembershipType(
                    referenceType,
                    referenceId,
                    (membershipType == null ) ? null : membershipType.name());

            return memberships.stream()
                    .map(this::convert)
                    .collect(Collectors.toSet());

        } catch (TechnicalException ex) {
            LOGGER.error("An error occurs while trying to get members for {} {}", referenceType, referenceId, ex);
            throw new TechnicalManagementException("An error occurs while trying to get members for "+ referenceType +" " + referenceId, ex);
        }
    }

    @Override
    public MemberEntity getMember(MembershipReferenceType referenceType, String referenceId, String username) {
        try {
            LOGGER.debug("Get membership for {} {} and user {}", referenceType, referenceId, username);

            Optional optionalMembership = membershipRepository.findById(username, referenceType, referenceId);

            if (optionalMembership.isPresent()) {
                return convert(optionalMembership.get());
            }

            return null;
        } catch (TechnicalException ex) {
            LOGGER.error("An error occurs while trying to get membership for {} {} and user", referenceType, referenceId, username, ex);
            throw new TechnicalManagementException("An error occurs while trying to get members for " + referenceType + " " + referenceId + " and user " + username, ex);
        }
    }

    @Override
    public void addOrUpdateMember(MembershipReferenceType referenceType, String referenceId, String username, MembershipType membershipType) {
        try {
            LOGGER.debug("Add a new member for {} {}", referenceType, referenceId);

            if ((MembershipReferenceType.API_GROUP.equals(referenceType)|| MembershipReferenceType.APPLICATION_GROUP.equals(referenceType))
                    && MembershipType.PRIMARY_OWNER.equals(membershipType)) {
                LOGGER.error("PRIMARY_OWNER is not authorized on Groups");
                throw new NotAuthorizedMembershipException(membershipType.name());
            }

            UserEntity user;

            try {
                user = userService.findByName(username);
            } catch (UserNotFoundException unfe) {
                // User does not exist so we are looking into defined providers
                io.gravitee.management.model.providers.User providerUser = identityService.findOne(username);
                if (providerUser != null) {
                    // Information will be updated after the first connection of the user
                    NewExternalUserEntity newUser = new NewExternalUserEntity();
                    newUser.setUsername(username);
                    newUser.setFirstname(providerUser.getFirstname());
                    newUser.setLastname(providerUser.getLastname());
                    newUser.setEmail(providerUser.getEmail());
                    newUser.setSource(providerUser.getSource());
                    newUser.setSourceId(providerUser.getSourceId());

                    user = userService.create(newUser);
                } else {
                    throw new UserNotFoundException(username);
                }
            }

            Optional optionalMembership =
                    membershipRepository.findById(username, referenceType, referenceId);
            Date updateDate = new Date();
            if (optionalMembership.isPresent()) {
                optionalMembership.get().setType(membershipType.name());
                optionalMembership.get().setUpdatedAt(updateDate);
                membershipRepository.update(optionalMembership.get());
            } else {
                Membership membership = new Membership(username, referenceId, referenceType);
                membership.setType(membershipType.name());
                membership.setCreatedAt(updateDate);
                membership.setUpdatedAt(updateDate);
                membershipRepository.create(membership);
            }

            if (user.getEmail() != null && !user.getEmail().isEmpty()) {
                emailService.sendAsyncEmailNotification(buildEmailNotification(user, referenceType, referenceId));
            }
        } catch (TechnicalException ex) {
            LOGGER.error("An error occurs while trying to add member for {} {}", referenceType, referenceId, ex);
            throw new TechnicalManagementException("An error occurs while trying to add member for " + referenceType + " " + referenceId, ex);
        }
    }

    @Override
    public void deleteMember(MembershipReferenceType referenceType, String referenceId, String username) {
        try {
            LOGGER.debug("Delete member {} for {} {}", username, referenceType, referenceId);

            membershipRepository.delete(new Membership(username, referenceId, referenceType));
        } catch (TechnicalException ex) {
            LOGGER.error("An error occurs while trying to delete member {} for {} {}", username, referenceType, referenceId, ex);
            throw new TechnicalManagementException("An error occurs while trying to delete member " + username + " for "+ referenceType +" " + referenceId, ex);
        }
    }

    private MemberEntity convert(Membership membership) {
        MemberEntity member = new MemberEntity();

        UserEntity userEntity = userService.findByName(membership.getUserId());
        member.setUsername(userEntity.getUsername());
        member.setCreatedAt(membership.getCreatedAt());
        member.setUpdatedAt(membership.getUpdatedAt());
        member.setType(MembershipType.valueOf(membership.getType()));
        member.setFirstname(userEntity.getFirstname());
        member.setLastname(userEntity.getLastname());
        member.setEmail(userEntity.getEmail());

        return member;
    }

    private EmailNotification buildEmailNotification(UserEntity user, MembershipReferenceType referenceType, String referenceId) {
        String subject = null;
        EmailNotificationBuilder.EmailTemplate template = null;
        Map params = null;

        switch (referenceType) {
            case APPLICATION:
                subject = "Subscription to application " + referenceId;
                template = EmailNotificationBuilder.EmailTemplate.APPLICATION_MEMBER_SUBSCRIPTION;
                params = ImmutableMap.of("application", referenceId, "username", user.getUsername());
                break;
            case API:
                subject = "Subscription to API " + referenceId;
                template = EmailNotificationBuilder.EmailTemplate.API_MEMBER_SUBSCRIPTION;
                params = ImmutableMap.of("api", referenceId, "username", user.getUsername());
                break;
            case APPLICATION_GROUP:
                subject = "Subscription to application group " + referenceId;
                template = EmailNotificationBuilder.EmailTemplate.APPLICATION_GROUP_MEMBER_SUBSCRIPTION;
                params = ImmutableMap.of("group", referenceId, "username", user.getUsername());
                break;
            case API_GROUP:
                subject = "Subscription to API group " + referenceId;
                template = EmailNotificationBuilder.EmailTemplate.API_MEMBER_GROUP_SUBSCRIPTION;
                params = ImmutableMap.of("group", referenceId, "username", user.getUsername());
                break;
        }

        return new EmailNotificationBuilder()
                .to(user.getEmail())
                .subject(subject)
                .template(template)
                .params(params)
                .build();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy