package com.thinkbiganalytics.feedmgr.service;
/*-
* #%L
* thinkbig-feed-manager-controller
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* 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.
* #L%
*/
import com.thinkbiganalytics.feedmgr.InvalidOperationException;
import com.thinkbiganalytics.feedmgr.rest.model.FeedCategory;
import com.thinkbiganalytics.feedmgr.rest.model.FeedMetadata;
import com.thinkbiganalytics.feedmgr.rest.model.FeedSummary;
import com.thinkbiganalytics.feedmgr.rest.model.NifiFeed;
import com.thinkbiganalytics.feedmgr.rest.model.RegisteredTemplate;
import com.thinkbiganalytics.feedmgr.rest.model.UIFeed;
import com.thinkbiganalytics.feedmgr.rest.model.UserFieldCollection;
import com.thinkbiganalytics.feedmgr.rest.model.UserProperty;
import com.thinkbiganalytics.nifi.rest.client.NifiClientRuntimeException;
import com.thinkbiganalytics.nifi.rest.model.NifiProperty;
import com.thinkbiganalytics.security.action.Action;
import org.springframework.stereotype.Service;
import java.security.AccessControlException;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import javax.annotation.Nonnull;
/**
* Provides access to category, feed, and template metadata.
*/
@Service
public interface MetadataService {
/**
* Checks the current security context has been granted permission to perform the specified action(s)
* on the feed with the specified feed ID. If the feed does not exist then no check is made.
* @param id the feed ID
* @param action an action to check
* @param more any additional actions to check
* @return true if the feed existed, otherwise false
* @throws AccessControlException thrown if the feed exists and the action(s) checked are not permitted
*/
boolean checkFeedPermission(String id, Action action, Action... more);
/**
* Register a template, save it, and return
*
* @param registeredTemplate a template to register/update
* @return the registered template
*/
RegisteredTemplate registerTemplate(RegisteredTemplate registeredTemplate);
/**
* Return all properties registered for a template
*
* @param templateId a template id
* @return all properties registered for a template
*/
List<NifiProperty> getTemplateProperties(String templateId);
/**
* Deletes a template
*
* @param templateId a registered template id
*/
void deleteRegisteredTemplate(String templateId);
/**
* Return all registered templates
*
* @return a list of all registered templates
*/
List<RegisteredTemplate> getRegisteredTemplates();
/**
* Finds a template by its name
* @param templateName the name of the template to look for
* @return the template
*/
RegisteredTemplate findRegisteredTemplateByName(final String templateName);
/**
* Create a new Feed in NiFi
*
* @param feedMetadata metadata about the feed
* @return an object with status information about the newly created feed, or error information if unsuccessful
*/
NifiFeed createFeed(FeedMetadata feedMetadata);
/**
* Deletes the specified feed.
*
* @param feedId the feed id
* @throws FeedCleanupFailedException if the cleanup flow was started but failed to complete successfully
* @throws FeedCleanupTimeoutException if the cleanup flow was started but failed to complete in the allotted time
* @throws IllegalArgumentException if the feed does not exist
* @throws IllegalStateException if there are dependent feeds
* @throws NifiClientRuntimeException if the feed cannot be deleted from NiFi
* @throws RuntimeException if the feed could not be deleted for any other reason
*/
void deleteFeed(@Nonnull String feedId);
/**
* Change the state of the feed to be {@link FeedMetadata.STATE#ENABLED}
*
* @param feedId the feed id
* @return a summary of the feed after being enabled
*/
FeedSummary enableFeed(String feedId);
/**
* Change the state of the feed to be {@link FeedMetadata.STATE#DISABLED}
*
* @param feedId the feed id
* @return a summary of the feed after being disabled
*/
FeedSummary disableFeed(String feedId);
/**
* @return a list of all the feeds in the system
*/
Collection<FeedMetadata> getFeeds();
/**
* Return a list of feeds, optionally returning a more verbose object populating all the templates and properties.
* Verbose will return {@link FeedMetadata} objects, false will return {@link FeedSummary} objects
*
* @param verbose true will return {@link FeedMetadata} objects, false will return {@link FeedSummary} objects
* @return a list of feed objects
*/
Collection<? extends UIFeed> getFeeds(boolean verbose);
/**
* @return a list of feeds
*/
List<FeedSummary> getFeedSummaryData();
/**
* Return a list of feeds in a given category
*
* @param categoryId the category to look at
* @return a list of feeds in a given category
*/
List<FeedSummary> getFeedSummaryForCategory(String categoryId);
/**
* Return a feed matching on its system category name and system feed name
*
* @param categoryName the system name for a category
* @param feedName the system feed name
* @return a feed matching on its system category name and system feed name
*/
FeedMetadata getFeedByName(String categoryName, String feedName);
/**
* Return a feed matching the feedId
*
* @param feedId the feed id
* @return a feed matching the feedId, null if not found
*/
FeedMetadata getFeedById(String feedId);
/**
* Return a feed matching the feedId.
*
* @param feedId the feed id
* @param refreshTargetTableSchema if true it will attempt to update the metadata of the destination table {@link FeedMetadata#table} with the real the destination
* @return a feed matching the feedId
*/
FeedMetadata getFeedById(String feedId, boolean refreshTargetTableSchema);
/**
* Return the categories
*
* @return the categories
*/
Collection<FeedCategory> getCategories();
/**
* Return a category matching a system name
*
* @param name a category system name
* @return the matching category, or null if not found
*/
FeedCategory getCategoryBySystemName(final String name);
/**
* save a category
*
* @param category a category to save
*/
void saveCategory(FeedCategory category);
/**
* Delete a category
*
* @return true if deleted, false if not
* @throws InvalidOperationException if unable to delete (categories cannot be deleted if there are feeds assigned to them)
*/
boolean deleteCategory(String categoryId) throws InvalidOperationException;
/**
* Gets the user-defined fields for all categories.
*
* @return the user-defined fields
*/
@Nonnull
Set<UserProperty> getCategoryUserFields();
/**
* Gets the user-defined fields for all feeds within the specified category.
*
* @param categoryId the category id
* @return the user-defined fields, if the category exists
*/
@Nonnull
Optional<Set<UserProperty>> getFeedUserFields(@Nonnull String categoryId);
/**
* Gets the user-defined fields for all categories and feeds.
*
* @return the user-defined fields
*/
@Nonnull
UserFieldCollection getUserFields();
/**
* Sets the user-defined fields for all categories and feeds.
*
* @param userFields the new user-defined fields
*/
void setUserFields(@Nonnull UserFieldCollection userFields);
}