Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

task: updated plugin list to include i/o vars, refactored detail get api #3627

Merged
merged 1 commit into from
Jul 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
145 changes: 90 additions & 55 deletions pkg/plugin/GlobalPluginService.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ type GlobalVariable struct {

type GlobalPluginService interface {
GetAllGlobalVariables() ([]*GlobalVariable, error)
ListAllPlugins() ([]*PluginMetadataDto, error)
ListAllPlugins() ([]*PluginListComponentDto, error)
GetPluginDetailById(pluginId int) (*PluginDetailDto, error)
}

Expand Down Expand Up @@ -72,48 +72,27 @@ func (impl *GlobalPluginServiceImpl) GetAllGlobalVariables() ([]*GlobalVariable,
return globalVariables, nil
}

func (impl *GlobalPluginServiceImpl) ListAllPlugins() ([]*PluginMetadataDto, error) {
func (impl *GlobalPluginServiceImpl) ListAllPlugins() ([]*PluginListComponentDto, error) {
impl.logger.Infow("request received, ListAllPlugins")

var plugins []*PluginMetadataDto

var pluginDetails []*PluginListComponentDto
//getting all plugins metadata(without tags)
pluginsMetadata, err := impl.globalPluginRepository.GetMetaDataForAllPlugins()
if err != nil {
impl.logger.Errorw("error in getting plugins", "err", err)
return nil, err
}
//getting all plugin tags
pluginTags, err := impl.globalPluginRepository.GetAllPluginTags()
if err != nil && err != pg.ErrNoRows {
impl.logger.Errorw("error in getting all plugin tags", "err", err)
pluginIdTagsMap, err := impl.getPluginIdTagsMap()
if err != nil {
impl.logger.Errorw("error, getPluginIdTagsMap", "err", err)
return nil, err
}
tagIdNameMap := make(map[int]string)
for _, tag := range pluginTags {
tagIdNameMap[tag.Id] = tag.Name
}
//getting plugin-tag relations
relations, err := impl.globalPluginRepository.GetAllPluginTagRelations()
pluginIdInputVariablesMap, pluginIdOutputVariablesMap, err := impl.getPluginIdVariablesMap()
if err != nil {
impl.logger.Errorw("error in getting all plugin-tag relations", "err", err)
impl.logger.Errorw("error, getPluginIdVariablesMap", "err", err)
return nil, err
}
pluginIdTagsMap := make(map[int][]string)
for _, relation := range relations {
tag, ok := tagIdNameMap[relation.TagId]
if ok {
tags, ok2 := pluginIdTagsMap[relation.PluginId]
if ok2 {
tags = append(tags, tag)
} else {
tags = []string{tag}
}
pluginIdTagsMap[relation.PluginId] = tags
}
}
for _, pluginMetadata := range pluginsMetadata {
plugin := &PluginMetadataDto{
pluginMetadataDto := &PluginMetadataDto{
Id: pluginMetadata.Id,
Name: pluginMetadata.Name,
Type: string(pluginMetadata.Type),
Expand All @@ -122,11 +101,16 @@ func (impl *GlobalPluginServiceImpl) ListAllPlugins() ([]*PluginMetadataDto, err
}
tags, ok := pluginIdTagsMap[pluginMetadata.Id]
if ok {
plugin.Tags = tags
pluginMetadataDto.Tags = tags
}
plugins = append(plugins, plugin)
pluginDetail := &PluginListComponentDto{
PluginMetadataDto: pluginMetadataDto,
InputVariables: pluginIdInputVariablesMap[pluginMetadata.Id],
OutputVariables: pluginIdOutputVariablesMap[pluginMetadata.Id],
}
pluginDetails = append(pluginDetails, pluginDetail)
}
return plugins, nil
return pluginDetails, nil
}

func (impl *GlobalPluginServiceImpl) GetPluginDetailById(pluginId int) (*PluginDetailDto, error) {
Expand All @@ -148,39 +132,90 @@ func (impl *GlobalPluginServiceImpl) GetPluginDetailById(pluginId int) (*PluginD
pluginDetail := &PluginDetailDto{
Metadata: metadataDto,
}
pluginDetail.InputVariables, pluginDetail.OutputVariables, err = impl.getIOVariablesOfAPlugin(pluginMetadata.Id)
if err != nil {
impl.logger.Errorw("error, getIOVariablesOfAPlugin", "err", err)
return nil, err
}
return pluginDetail, nil
}

//getting exposed variables
pluginVariables, err := impl.globalPluginRepository.GetExposedVariablesByPluginId(pluginId)
func (impl *GlobalPluginServiceImpl) getPluginIdTagsMap() (map[int][]string, error) {
//getting all plugin tags
pluginTags, err := impl.globalPluginRepository.GetAllPluginTags()
if err != nil && err != pg.ErrNoRows {
impl.logger.Errorw("error in getting all plugin tags", "err", err)
return nil, err
}
tagIdNameMap := make(map[int]string)
for _, tag := range pluginTags {
tagIdNameMap[tag.Id] = tag.Name
}
//getting plugin-tag relations
relations, err := impl.globalPluginRepository.GetAllPluginTagRelations()
if err != nil {
impl.logger.Errorw("error in getting pluginVariables by pluginId", "err", err, "pluginId", pluginId)
impl.logger.Errorw("error in getting all plugin-tag relations", "err", err)
return nil, err
}
pluginIdTagsMap := make(map[int][]string)
for _, relation := range relations {
tag, ok := tagIdNameMap[relation.TagId]
if ok {
pluginIdTagsMap[relation.PluginId] = append(pluginIdTagsMap[relation.PluginId], tag)
}
}
return pluginIdTagsMap, nil
}

var inputVariablesDto []*PluginVariableDto
var outputVariablesDto []*PluginVariableDto
func (impl *GlobalPluginServiceImpl) getPluginIdVariablesMap() (map[int][]*PluginVariableDto, map[int][]*PluginVariableDto, error) {
variables, err := impl.globalPluginRepository.GetExposedVariablesForAllPlugins()
if err != nil {
impl.logger.Errorw("error in getting exposed vars for all plugins", "err", err)
return nil, nil, err
}
pluginIdInputVarsMap, pluginIdOutputVarsMap := make(map[int][]*PluginVariableDto), make(map[int][]*PluginVariableDto)
for _, variable := range variables {
variableDto := getVariableDto(variable)
if variable.VariableType == repository.PLUGIN_VARIABLE_TYPE_INPUT {
pluginIdInputVarsMap[variable.PluginMetadataId] = append(pluginIdInputVarsMap[variable.PluginMetadataId], variableDto)
} else if variable.VariableType == repository.PLUGIN_VARIABLE_TYPE_OUTPUT {
pluginIdOutputVarsMap[variable.PluginMetadataId] = append(pluginIdOutputVarsMap[variable.PluginMetadataId], variableDto)
}
}
return pluginIdInputVarsMap, pluginIdOutputVarsMap, nil
}

func (impl *GlobalPluginServiceImpl) getIOVariablesOfAPlugin(pluginId int) (inputVariablesDto, outputVariablesDto []*PluginVariableDto, err error) {
//getting exposed variables
pluginVariables, err := impl.globalPluginRepository.GetExposedVariablesByPluginId(pluginId)
if err != nil {
impl.logger.Errorw("error in getting pluginVariables by pluginId", "err", err, "pluginId", pluginId)
return nil, nil, err
}
for _, pluginVariable := range pluginVariables {
variableDto := &PluginVariableDto{
Id: pluginVariable.Id,
Name: pluginVariable.Name,
Format: pluginVariable.Format,
Description: pluginVariable.Description,
IsExposed: pluginVariable.IsExposed,
AllowEmptyValue: pluginVariable.AllowEmptyValue,
DefaultValue: pluginVariable.DefaultValue,
Value: pluginVariable.Value,
ValueType: pluginVariable.ValueType,
PreviousStepIndex: pluginVariable.PreviousStepIndex,
VariableStepIndex: pluginVariable.VariableStepIndex,
ReferenceVariableName: pluginVariable.ReferenceVariableName,
}
variableDto := getVariableDto(pluginVariable)
if pluginVariable.VariableType == repository.PLUGIN_VARIABLE_TYPE_INPUT {
inputVariablesDto = append(inputVariablesDto, variableDto)
} else if pluginVariable.VariableType == repository.PLUGIN_VARIABLE_TYPE_OUTPUT {
outputVariablesDto = append(outputVariablesDto, variableDto)
}
}
pluginDetail.InputVariables = inputVariablesDto
pluginDetail.OutputVariables = outputVariablesDto
return pluginDetail, nil
return inputVariablesDto, outputVariablesDto, nil
}

func getVariableDto(pluginVariable *repository.PluginStepVariable) *PluginVariableDto {
return &PluginVariableDto{
Id: pluginVariable.Id,
Name: pluginVariable.Name,
Format: pluginVariable.Format,
Description: pluginVariable.Description,
IsExposed: pluginVariable.IsExposed,
AllowEmptyValue: pluginVariable.AllowEmptyValue,
DefaultValue: pluginVariable.DefaultValue,
Value: pluginVariable.Value,
ValueType: pluginVariable.ValueType,
PreviousStepIndex: pluginVariable.PreviousStepIndex,
VariableStepIndex: pluginVariable.VariableStepIndex,
ReferenceVariableName: pluginVariable.ReferenceVariableName,
}
}
6 changes: 6 additions & 0 deletions pkg/plugin/bean.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ type PluginDetailDto struct {
OutputVariables []*PluginVariableDto `json:"outputVariables"`
}

type PluginListComponentDto struct { //created new struct for backward compatibility (needed to add input and output Vars along with metadata fields)
*PluginMetadataDto
InputVariables []*PluginVariableDto `json:"inputVariables"`
OutputVariables []*PluginVariableDto `json:"outputVariables"`
}

type PluginMetadataDto struct {
Id int `json:"id"`
Name string `json:"name"`
Expand Down
17 changes: 17 additions & 0 deletions pkg/plugin/repository/GlobalPluginRepository.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ type PluginStepVariable struct {
ReferenceVariableName string `sql:"reference_variable_name"`
Deleted bool `sql:"deleted,notnull"`
sql.AuditLog
PluginMetadataId int `sql:"-"`
}

type PluginStepCondition struct {
Expand All @@ -166,6 +167,7 @@ type GlobalPluginRepository interface {
GetStepsByPluginIds(pluginIds []int) ([]*PluginStep, error)
GetExposedVariablesByPluginIdAndVariableType(pluginId int, variableType PluginStepVariableType) ([]*PluginStepVariable, error)
GetExposedVariablesByPluginId(pluginId int) ([]*PluginStepVariable, error)
GetExposedVariablesForAllPlugins() ([]*PluginStepVariable, error)
GetConditionsByStepId(stepId int) ([]*PluginStepCondition, error)
}

Expand Down Expand Up @@ -322,6 +324,21 @@ func (impl *GlobalPluginRepositoryImpl) GetExposedVariablesByPluginId(pluginId i
return pluginVariables, nil
}

func (impl *GlobalPluginRepositoryImpl) GetExposedVariablesForAllPlugins() ([]*PluginStepVariable, error) {
var pluginVariables []*PluginStepVariable
query := `SELECT psv.*, pm.id as plugin_metadata_id from plugin_step_variable psv
INNER JOIN plugin_step ps on ps.id = psv.plugin_step_id
INNER JOIN plugin_metadata pm on pm.id = ps.plugin_id
WHERE psv.deleted = ? and psv.is_exposed = ? and
ps.deleted = ? and pm.deleted = ?;`
_, err := impl.dbConnection.Query(&pluginVariables, query, false, true, false, false)
if err != nil {
impl.logger.Errorw("err in getting exposed variables for all plugins", "err", err)
return nil, err
}
return pluginVariables, nil
}

func (impl *GlobalPluginRepositoryImpl) GetConditionsByStepId(stepId int) ([]*PluginStepCondition, error) {
var conditions []*PluginStepCondition
err := impl.dbConnection.Model(&conditions).
Expand Down