github.com/sharovik/devbot@v1.0.1-0.20240308094637-4a0387c40516/internal/service/scenarios.go (about)

     1  package service
     2  
     3  import (
     4  	"database/sql"
     5  
     6  	"github.com/sharovik/devbot/internal/log"
     7  
     8  	"github.com/sharovik/devbot/internal/database"
     9  	"github.com/sharovik/devbot/internal/dto/databasedto"
    10  	"github.com/sharovik/devbot/internal/service/analiser"
    11  
    12  	"github.com/sharovik/devbot/internal/container"
    13  	"github.com/sharovik/devbot/internal/dto"
    14  	"github.com/sharovik/orm/clients"
    15  	cdto "github.com/sharovik/orm/dto"
    16  	cquery "github.com/sharovik/orm/query"
    17  )
    18  
    19  // GenerateDMAnswerForScenarioStep method generates DM object for selected scenario step
    20  func GenerateDMAnswerForScenarioStep(step string) (dto.DictionaryMessage, error) {
    21  	query := new(clients.Query).
    22  		Select([]interface{}{
    23  			"scenarios.id",
    24  			"scenarios.event_id",
    25  			"questions.id as question_id",
    26  			"questions.answer",
    27  			"questions.question",
    28  			"questions_regex.regex as question_regex",
    29  			"questions_regex.regex_group as question_regex_group",
    30  			"events.alias",
    31  		}).
    32  		From(&cdto.BaseModel{TableName: "questions"}).
    33  		Join(cquery.Join{
    34  			Target: cquery.Reference{
    35  				Table: "scenarios",
    36  				Key:   "id",
    37  			},
    38  			With: cquery.Reference{
    39  				Table: "questions",
    40  				Key:   "scenario_id",
    41  			},
    42  			Condition: "=",
    43  			Type:      cquery.InnerJoinType,
    44  		}).
    45  		Join(cquery.Join{
    46  			Target: cquery.Reference{
    47  				Table: "questions_regex",
    48  				Key:   "id",
    49  			},
    50  			With: cquery.Reference{
    51  				Table: "questions",
    52  				Key:   "regex_id",
    53  			},
    54  			Condition: "=",
    55  			Type:      cquery.LeftJoinType,
    56  		}).
    57  		Join(cquery.Join{
    58  			Target: cquery.Reference{
    59  				Table: "events",
    60  				Key:   "id",
    61  			},
    62  			With: cquery.Reference{
    63  				Table: "scenarios",
    64  				Key:   "event_id",
    65  			},
    66  			Condition: "=",
    67  			Type:      cquery.LeftJoinType,
    68  		}).Where(cquery.Where{
    69  		First:    "questions.answer",
    70  		Operator: "=",
    71  		Second: cquery.Bind{
    72  			Field: "answer",
    73  			Value: step,
    74  		},
    75  	})
    76  
    77  	res, err := container.C.Dictionary.GetDBClient().Execute(query)
    78  
    79  	if err == sql.ErrNoRows {
    80  		return dto.DictionaryMessage{}, nil
    81  	} else if err != nil {
    82  		return dto.DictionaryMessage{}, err
    83  	}
    84  
    85  	if len(res.Items()) == 0 {
    86  		return dto.DictionaryMessage{}, nil
    87  	}
    88  
    89  	//We take first item and use it as the result
    90  	item := res.Items()[0]
    91  
    92  	var (
    93  		r  string
    94  		rg string
    95  	)
    96  
    97  	if item.GetField("question_regex").Value != nil {
    98  		r = item.GetField("question_regex").Value.(string)
    99  	}
   100  
   101  	if item.GetField("question_regex_group").Value != nil {
   102  		rg = item.GetField("question_regex_group").Value.(string)
   103  	}
   104  
   105  	return dto.DictionaryMessage{
   106  		ScenarioID:            int64(item.GetField("id").Value.(int)),
   107  		EventID:               int64(item.GetField("event_id").Value.(int)),
   108  		Answer:                item.GetField("answer").Value.(string),
   109  		QuestionID:            int64(item.GetField("question_id").Value.(int)),
   110  		Question:              item.GetField("question").Value.(string),
   111  		Regex:                 r,
   112  		MainGroupIndexInRegex: rg,
   113  		ReactionType:          item.GetField("alias").Value.(string),
   114  	}, nil
   115  }
   116  
   117  // PrepareScenario based on scenarioID and reaction type, database.EventScenario will be generated
   118  func PrepareScenario(scenarioID int64, reactionType string) (scenario database.EventScenario, err error) {
   119  	scenario.ID = scenarioID
   120  	questions, err := container.C.Dictionary.GetQuestionsByScenarioID(scenario.ID, true)
   121  	if err != nil {
   122  		return scenario, err
   123  	}
   124  
   125  	eventID, err := container.C.Dictionary.FindEventByAlias(reactionType)
   126  	if err != nil {
   127  		return scenario, err
   128  	}
   129  
   130  	scenario.EventName = reactionType
   131  	scenario.EventID = eventID
   132  	analiser.SetScenarioQuestions(&scenario, questions)
   133  
   134  	return scenario, nil
   135  }
   136  
   137  // PrepareEventScenario
   138  // Method generates the scenario object based on the eventId and reaction type received
   139  // eventID - is the ID of event
   140  // reactionType
   141  func PrepareEventScenario(eventID int64, reactionType string) (scenario database.EventScenario, err error) {
   142  	//We are getting scenario
   143  	q := new(clients.Query).Select(databasedto.ScenariosModel.GetColumns()).
   144  		From(databasedto.ScenariosModel).
   145  		Where(cquery.Where{
   146  			First:    "event_id",
   147  			Operator: "=",
   148  			Second: cquery.Bind{
   149  				Field: "event_id",
   150  				Value: eventID,
   151  			},
   152  		}).OrderBy("id", cquery.OrderDirectionAsc).Limit(cquery.Limit{
   153  		From: 0,
   154  		To:   1,
   155  	})
   156  	res, err := container.C.Dictionary.GetDBClient().Execute(q)
   157  	if err != nil {
   158  		return scenario, err
   159  	}
   160  
   161  	if len(res.Items()) == 0 {
   162  		log.Logger().Warn().
   163  			Int64("event_id", eventID).
   164  			Str("reaction_type", reactionType).
   165  			Msg("No scenarios found")
   166  		return scenario, nil
   167  	}
   168  
   169  	scenario.ID = int64(res.Items()[0].GetField("id").Value.(int))
   170  	variables, err := container.C.Dictionary.GetQuestionsByScenarioID(scenario.ID, true)
   171  	if err != nil {
   172  		return scenario, err
   173  	}
   174  	analiser.SetScenarioQuestions(&scenario, variables)
   175  
   176  	scenario.EventName = reactionType
   177  	scenario.EventID = eventID
   178  
   179  	return scenario, nil
   180  }