@Override
  public void sendMemberRequest(String userId, String communityId) {
    Assert.notNull(userId, "userId must not be null");
    Assert.notNull(communityId, "communityId must not be null");

    User user = userRepository.findOne(userId);
    Community community = communityRepository.findOne(communityId);

    if (user == null) {
      String msg = String.format("user not find by id %s", userId);
      logger.debug(msg);
      throw errorService.createException(AccountException.class, ErrorEnum.ERROR_USER_NOT_FOUND);
    } else if (!user.getStatus().equals(AccountStatusEnum.ACTIVE)) {
      String msg = String.format("user status must be: %s", AccountStatusEnum.ACTIVE);
      logger.debug(msg);
      throw errorService.createException(AccountException.class, ErrorEnum.ERROR_USER_NOT_ACTIVE);
    } else if (community == null) {
      String msg = String.format("community not find by id %s", communityId);
      logger.debug(msg);
      throw errorService.createException(
          AccountException.class, ErrorEnum.ERROR_COMMUNITY_NOT_FOUND);
    } else if (!community.getStatus().equals(AccountStatusEnum.ACTIVE)) {
      String msg = String.format("community status must be: %s", AccountStatusEnum.ACTIVE);
      logger.debug(msg);
      throw errorService.createException(
          AccountException.class, ErrorEnum.ERROR_COMMUNITY_NOT_ACTIVE);
    } else {
      Notification notification = new Notification();
      notification.setFromId(userId);
      notification.setToId(communityId);
      notification.setType(NotificationTypeEnum.MEMBER);
      notificationService.addNotification(notification);
    }
  }
  @Override
  public void deleteMember(String userId, String communityId) {
    Assert.notNull(userId, "userId must not be null");
    Assert.notNull(communityId, "communityId must not be null");

    User user = userRepository.findOne(userId);
    Community community = communityRepository.findOne(communityId);

    if (user == null) {
      String msg = String.format("user not find by id %s", userId);
      logger.debug(msg);
      throw errorService.createException(AccountException.class, ErrorEnum.ERROR_USER_NOT_FOUND);
    } else if (!user.getStatus().equals(AccountStatusEnum.ACTIVE)) {
      String msg = String.format("user status must be: %s", AccountStatusEnum.ACTIVE);
      logger.debug(msg);
      throw errorService.createException(AccountException.class, ErrorEnum.ERROR_USER_NOT_ACTIVE);
    } else if (community == null) {
      String msg = String.format("community not find by id %s", communityId);
      logger.debug(msg);
      throw errorService.createException(
          AccountException.class, ErrorEnum.ERROR_COMMUNITY_NOT_FOUND);
    } else if (!community.getStatus().equals(AccountStatusEnum.ACTIVE)) {
      String msg = String.format("community status must be: %s", AccountStatusEnum.ACTIVE);
      logger.debug(msg);
      throw errorService.createException(
          AccountException.class, ErrorEnum.ERROR_COMMUNITY_NOT_ACTIVE);
    } else {
      relationRepository.remove(communityId, userId, RelationTypeEnum.MEMBER);
      accountStoreService.update(userId);
    }
  }
  @Override
  public void deleteOwner(String userId, String communityId) {
    Assert.notNull(userId, "userId must not be null");
    Assert.notNull(communityId, "communityId must not be null");

    User user = userRepository.findOne(userId);
    Community community = communityRepository.findOne(communityId);

    if (user == null) {
      String msg = String.format("user not find by id %s", userId);
      logger.debug(msg);
      throw errorService.createException(AccountException.class, ErrorEnum.ERROR_USER_NOT_FOUND);
    } else if (!user.getStatus().equals(AccountStatusEnum.ACTIVE)) {
      String msg = String.format("user status must be: %s", AccountStatusEnum.ACTIVE);
      logger.debug(msg);
      throw errorService.createException(AccountException.class, ErrorEnum.ERROR_USER_NOT_ACTIVE);
    } else if (community == null) {
      String msg = String.format("community not find by id %s", communityId);
      logger.debug(msg);
      throw errorService.createException(
          AccountException.class, ErrorEnum.ERROR_COMMUNITY_NOT_FOUND);
    } else if (!community.getStatus().equals(AccountStatusEnum.ACTIVE)) {
      String msg = String.format("community status must be: %s", AccountStatusEnum.ACTIVE);
      logger.debug(msg);
      throw errorService.createException(
          AccountException.class, ErrorEnum.ERROR_COMMUNITY_NOT_ACTIVE);
    } else {
      String[] typeRelations = new String[1];
      typeRelations[0] = RelationTypeEnum.OWNER.toString();

      List<Relation> relations =
          relationRepository.findByAccountRelationCriteria(
              new AccountRelationCriteria(communityId, typeRelations));

      if (relations != null
          && relations.size() == 1
          && relations.get(0).getUserIds() != null
          && relations.get(0).getUserIds().length > 1) {
        relationRepository.remove(communityId, userId, RelationTypeEnum.OWNER);
        accountStoreService.update(userId);
      } else {
        String msg =
            String.format("the sole owner %s of the user community active %s", userId, communityId);
        logger.debug(msg);
        throw errorService.createException(
            AccountException.class, ErrorEnum.ERROR_SOLE_OWNER_OF_THE_USER_COMMUNITY_ACTIVE);
      }
    }
  }