Database sample data, make target and go code

This commit is contained in:
Imbus 2024-03-18 22:07:02 +01:00
parent 47b60038b4
commit c31f145c35
4 changed files with 64 additions and 0 deletions

View file

@ -20,6 +20,7 @@ type Database interface {
GetUserId(username string) (int, error)
AddProject(name string, description string, username string) error
Migrate() error
MigrateSampleData() error
GetProjectId(projectname string) (int, error)
AddWeeklyReport(projectName string, userName string, week int, developmentTime int, meetingTime int, adminTime int, ownWorkTime int, studyTime int, testingTime int) error
AddUserToProject(username string, projectname string, role string) error
@ -49,6 +50,9 @@ type UserProjectMember struct {
//go:embed migrations
var scripts embed.FS
//go:embed sample_data
var sampleData embed.FS
// TODO: Possibly break these out into separate files bundled with the embed package?
const userInsert = "INSERT INTO users (username, password) VALUES (?, ?)"
const projectInsert = "INSERT INTO projects (name, description, owner_user_id) SELECT ?, ?, id FROM users WHERE username = ?"
@ -378,3 +382,42 @@ func (d *Db) Migrate() error {
return nil
}
// MigrateSampleData applies sample data to the database.
func (d *Db) MigrateSampleData() error {
// Insert sample data
files, err := sampleData.ReadDir("sample_data")
if err != nil {
return err
}
if len(files) == 0 {
println("No sample data files found")
}
tr := d.MustBegin()
// Iterate over each SQL file and execute it
for _, file := range files {
if file.IsDir() || filepath.Ext(file.Name()) != ".sql" {
continue
}
// This is perhaps not the most elegant way to do this
sqlBytes, err := sampleData.ReadFile("sample_data/" + file.Name())
if err != nil {
return err
}
sqlQuery := string(sqlBytes)
_, err = tr.Exec(sqlQuery)
if err != nil {
return err
}
}
if tr.Commit() != nil {
return err
}
return nil
}

View file

@ -0,0 +1,7 @@
INSERT OR IGNORE INTO users (username, password) VALUES
('admin', 'password'),
('user', 'password');
INSERT OR IGNORE INTO projects (name, description, owner_user_id) VALUES
('Project 1', 'Description 1', 1),
('Project 2', 'Description 2', 2);