aboutsummaryrefslogtreecommitdiff
path: root/database/database.go
blob: dedae594dc63e830a6c3b2c9c531131c4f47626a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package database

import (
	"fmt"
	"imageboard/config"
	"imageboard/models"
	"log"

	"gorm.io/driver/postgres"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

var (
	DB  *gorm.DB
	err error
)

func init() {
	dsn := fmt.Sprintf("host=%s port=%d user=%s dbname=%s sslmode=%s",
		config.Database.Host,
		config.Database.Port,
		config.Database.Username,
		config.Database.DatabaseName,
		config.Database.SSLMode,
	)

	if config.Database.Password != "" {
		dsn += fmt.Sprintf(" password=%s", config.Database.Password)
	}

	logLevel := logger.Silent
	if config.Server.IsDevMode {
		logLevel = logger.Info
	}

	dialector := postgres.Open(dsn)

	DB, err = gorm.Open(dialector, &gorm.Config{
		Logger: logger.Default.LogMode(logLevel),
	})
	if err != nil {
		log.Fatalf("failed to connect to database: %v", err)
	}

	if config.Server.IsDevMode && config.Database.WipeAndResetDatabase {
		if err := wipeAndResetDatabase(); err != nil {
			log.Fatalf("failed to wipe and reset database: %v", err)
		}
		log.Println("Database wiped and reset successfully")
	}

	if err := autoMigrate(); err != nil {
		log.Fatalf("failed to auto migrate database: %v", err)
	}

	log.Println("Database connection established successfully")
}

func autoMigrate() error {
	return DB.AutoMigrate(
		&models.User{},
		&models.Image{},
		&models.ImageSize{},
		&models.Tag{},
		&models.Comment{},
		&models.EmailToken{},
	)
}

func wipeAndResetDatabase() error {
	if err := DB.Exec("DROP SCHEMA public CASCADE").Error; err != nil {
		return err
	}
	if err := DB.Exec("CREATE SCHEMA public").Error; err != nil {
		return err
	}
	return nil
}