This repository was archived by the owner on Feb 12, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdb.go
137 lines (116 loc) · 3.67 KB
/
db.go
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package main
import (
"database/sql"
"io"
"log"
"os"
"github.com/gchaincl/dotsql"
_ "github.com/mattn/go-sqlite3" // Import go-sqlite3 library
)
type DatabaseUtility struct {
dot *dotsql.DotSql
dbContext *sql.DB
}
const queries = `
-- name: create-stream-key-table
CREATE TABLE IF NOT EXISTS stream_keys (
id INTEGER PRIMARY KEY AUTOINCREMENT,
stream_key TEXT NOT NULL UNIQUE,
is_valid INTEGER NOT NULL
);
--name: create-users-table
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
password TEXT NOT NULL,
is_admin INTEGER NOT NULL
);
-- name: get-streams
SELECT id, is_valid, stream_key FROM stream_keys;
-- name: create-new-stream
INSERT INTO stream_keys (stream_key, is_valid) VALUES (?, 0);
-- name: delete-stream
DELETE FROM stream_keys WHERE id = ?;
-- name: toggle-stream
UPDATE stream_keys SET is_valid = ? WHERE stream_key = ?;
--name: create-new-user
INSERT INTO users (username, password, is_admin) VALUES (?, ?, ?);
--name: validate-user
SELECT id, is_admin, password FROM users WHERE username = ? LIMIT 1;
`
func DbInitialize(homeFolder string) *DatabaseUtility {
sqlDBPath := homeFolder + SQLITE_DATABASE
db := new(DatabaseUtility)
db.createDb(sqlDBPath)
sqlContext, openError := sql.Open("sqlite3", sqlDBPath)
if openError == nil {
db.dbContext = sqlContext
}
dot, loadError := dotsql.LoadFromString(queries)
if loadError == nil {
db.dot = dot
}
db.seedDb()
initialAdminPassword := os.Getenv("ADMIN_PASSWORD")
if initialAdminPassword == "" {
log.Println("Admin password not set, generating...")
initialAdminPassword = generatePassword(32)
}
db.CreateNewUser("admin", initialAdminPassword, 1)
file, fileError := os.Create(homeFolder + "initial-admin-password")
if fileError != nil {
log.Fatalf("Cannot open file! %s", fileError)
}
defer file.Close()
_, writeError := io.WriteString(file, initialAdminPassword)
if writeError != nil {
log.Fatalf("Cannot write to file! %s", fileError)
}
file.Sync()
log.Printf("Inital login is username: admin, password: %s", initialAdminPassword)
return db
}
func (db *DatabaseUtility) CloseDb() {
db.dbContext.Close()
}
func (db *DatabaseUtility) createDb(sqlDBPath string) {
if _, err := os.Stat(sqlDBPath); os.IsNotExist(err) {
// path/to/whatever does not exist
log.Printf("Creating %s...", sqlDBPath)
file, err := os.Create(sqlDBPath) // Create SQLite file
if err != nil {
log.Fatal(err.Error())
}
file.Close()
}
log.Printf("%s created", sqlDBPath)
}
func (db *DatabaseUtility) seedDb() {
_, streamKeyTableErr := db.dot.Exec(db.dbContext, "create-stream-key-table")
if streamKeyTableErr != nil {
panic(streamKeyTableErr)
}
_, err := db.dot.Exec(db.dbContext, "create-users-table")
if err != nil {
panic(err)
}
}
func (db *DatabaseUtility) ToggleStream(status int, streamKey string) (sql.Result, error) {
return db.dot.Exec(db.dbContext, "toggle-stream", status, streamKey)
}
func (db *DatabaseUtility) GetStreams() (*sql.Rows, error) {
return db.dot.Query(db.dbContext, "get-streams")
}
func (db *DatabaseUtility) CreateNewStream(guid string) (sql.Result, error) {
return db.dot.Exec(db.dbContext, "create-new-stream", guid)
}
func (db *DatabaseUtility) DeleteStream(id string) (sql.Result, error) {
return db.dot.Exec(db.dbContext, "delete-stream", id)
}
func (db *DatabaseUtility) Login(username, password string) (*sql.Rows, error) {
return db.dot.Query(db.dbContext, "validate-user", username, password)
}
func (db *DatabaseUtility) CreateNewUser(username, password string, isAdmin int) (sql.Result, error) {
hashedPwd, _ := HashPassword(password)
return db.dot.Exec(db.dbContext, "create-new-user", username, hashedPwd, isAdmin)
}