github.com/sharovik/devbot@v1.0.1-0.20240308094637-4a0387c40516/scripts/install/database/install.go (about) 1 package database 2 3 import ( 4 "fmt" 5 6 "github.com/pkg/errors" 7 "github.com/sharovik/devbot/internal/container" 8 "github.com/sharovik/devbot/internal/dto/databasedto" 9 "github.com/sharovik/orm/clients" 10 "github.com/sharovik/orm/dto" 11 cquery "github.com/sharovik/orm/query" 12 ) 13 14 type InstallMigration struct { 15 Client clients.BaseClientInterface 16 } 17 18 func (m InstallMigration) SetClient(client clients.BaseClientInterface) { 19 m.Client = client 20 } 21 22 func (m InstallMigration) GetName() string { 23 return "install" 24 } 25 26 func (m InstallMigration) Execute() error { 27 client := container.C.Dictionary.GetDBClient() 28 29 if err := createSchema(client); err != nil { 30 return err 31 } 32 33 return nil 34 } 35 36 func createSchema(client clients.BaseClientInterface) error { 37 //Create events table 38 q := new(clients.Query). 39 Create(databasedto.EventModel). 40 IfNotExists(). 41 AddIndex(dto.Index{ 42 Name: "events_name_uindex", 43 Target: databasedto.EventModel.GetTableName(), 44 Key: "alias", 45 Unique: true, 46 }) 47 if _, err := client.Execute(q); err != nil { 48 return errors.Wrap(err, fmt.Sprintf("Failed to create %s table", databasedto.EventModel.GetTableName())) 49 } 50 51 //Create questions_regex table 52 q = new(clients.Query). 53 Create(databasedto.QuestionsRegexModel). 54 IfNotExists(). 55 AddIndex(dto.Index{ 56 Name: "question_regex_regex_uindex", 57 Target: databasedto.QuestionsRegexModel.GetTableName(), 58 Key: "regex", 59 Unique: true, 60 }) 61 if _, err := client.Execute(q); err != nil { 62 return errors.Wrap(err, fmt.Sprintf("Failed to create %s table", databasedto.QuestionsRegexModel.GetTableName())) 63 } 64 65 //Create scenarios table 66 q = new(clients.Query). 67 Create(databasedto.ScenariosModel). 68 IfNotExists(). 69 AddIndex(dto.Index{ 70 Name: "scenarios_name_uindex", 71 Target: databasedto.ScenariosModel.GetTableName(), 72 Key: "name", 73 Unique: true, 74 }). 75 AddForeignKey(dto.ForeignKey{ 76 Name: "event_id", 77 Target: cquery.Reference{ 78 Table: databasedto.EventModel.GetTableName(), 79 Key: "id", 80 }, 81 With: cquery.Reference{ 82 Table: databasedto.ScenariosModel.GetTableName(), 83 Key: "event_id", 84 }, 85 OnDelete: dto.SetNullAction, 86 OnUpdate: dto.NoActionAction, 87 }) 88 if _, err := client.Execute(q); err != nil { 89 return errors.Wrap(err, fmt.Sprintf("Failed to create %s table", databasedto.ScenariosModel.GetTableName())) 90 } 91 92 //Create questions table 93 q = new(clients.Query). 94 Create(databasedto.QuestionsModel). 95 IfNotExists(). 96 AddIndex(dto.Index{ 97 Name: "questions_question_index", 98 Target: databasedto.QuestionsModel.GetTableName(), 99 Key: "question", 100 Unique: false, 101 }). 102 AddForeignKey(dto.ForeignKey{ 103 Name: "scenario_id", 104 Target: cquery.Reference{ 105 Table: databasedto.ScenariosModel.GetTableName(), 106 Key: "id", 107 }, 108 With: cquery.Reference{ 109 Table: databasedto.QuestionsModel.GetTableName(), 110 Key: "scenario_id", 111 }, 112 OnDelete: dto.CascadeAction, 113 OnUpdate: dto.NoActionAction, 114 }). 115 AddForeignKey(dto.ForeignKey{ 116 Name: "regex_id", 117 Target: cquery.Reference{ 118 Table: databasedto.QuestionsRegexModel.GetTableName(), 119 Key: "id", 120 }, 121 With: cquery.Reference{ 122 Table: databasedto.QuestionsModel.GetTableName(), 123 Key: "regex_id", 124 }, 125 OnDelete: dto.SetNullAction, 126 OnUpdate: dto.NoActionAction, 127 }) 128 if _, err := client.Execute(q); err != nil { 129 return errors.Wrap(err, fmt.Sprintf("Failed to create %s table", databasedto.QuestionsModel.GetTableName())) 130 } 131 132 //Create questions table 133 q = new(clients.Query). 134 Create(databasedto.SchedulesModel). 135 IfNotExists(). 136 AddIndex(dto.Index{ 137 Name: "execute_at_index", 138 Target: databasedto.SchedulesModel.GetTableName(), 139 Key: "execute_at", 140 Unique: false, 141 }). 142 AddForeignKey(dto.ForeignKey{ 143 Name: "scenario_id", 144 Target: cquery.Reference{ 145 Table: databasedto.ScenariosModel.GetTableName(), 146 Key: "id", 147 }, 148 With: cquery.Reference{ 149 Table: databasedto.SchedulesModel.GetTableName(), 150 Key: "scenario_id", 151 }, 152 OnDelete: dto.SetNullAction, 153 OnUpdate: dto.NoActionAction, 154 }). 155 AddForeignKey(dto.ForeignKey{ 156 Name: "event_id", 157 Target: cquery.Reference{ 158 Table: databasedto.EventModel.GetTableName(), 159 Key: "id", 160 }, 161 With: cquery.Reference{ 162 Table: databasedto.SchedulesModel.GetTableName(), 163 Key: "event_id", 164 }, 165 OnDelete: dto.SetNullAction, 166 OnUpdate: dto.NoActionAction, 167 }) 168 if _, err := client.Execute(q); err != nil { 169 return errors.Wrap(err, fmt.Sprintf("Failed to create %s table", databasedto.SchedulesModel.GetTableName())) 170 } 171 172 return nil 173 }