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  }