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 }