forked from BestLine/Webtoolkit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsql_lite_controller.go
272 lines (235 loc) · 7.38 KB
/
sql_lite_controller.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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
package main
import (
"database/sql"
"fmt"
"github.com/sirupsen/logrus"
_ "modernc.org/sqlite"
)
func createSQLiteDB() (*sql.DB, error) {
// Открываем или создаем файл базы данных SQLite
db, err := sql.Open("sqlite", "./mydatabase.db")
if err != nil {
return nil, err
}
// Создаем таблицы (если их нет)
_, err = db.Exec(`
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
password TEXT NOT NULL,
email TEXT
)
`)
if err != nil {
db.Close()
return nil, err
}
_, err = db.Exec(`
CREATE TABLE IF NOT EXISTS roles (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL
)
`)
if err != nil {
db.Close()
return nil, err
}
_, err = db.Exec(`
CREATE TABLE IF NOT EXISTS user_roles (
user_id INTEGER,
role_id INTEGER,
FOREIGN KEY(user_id) REFERENCES users(id),
FOREIGN KEY(role_id) REFERENCES roles(id)
)
`)
_, err = db.Exec(`
CREATE TABLE IF NOT EXISTS user_projects (
user_id INTEGER,
project_id INTEGER,
active INTEGER,
FOREIGN KEY(user_id) REFERENCES users(id),
FOREIGN KEY(project_id) REFERENCES projects(id)
)
`)
_, err = db.Exec(`
CREATE TABLE IF NOT EXISTS projects (
id INTEGER PRIMARY KEY AUTOINCREMENT,
project_name TEXT NOT NULL
)
`)
if err != nil {
db.Close()
return nil, err
}
return db, nil
}
func registerUser(db *sql.DB, username, password, email string, roles []string) error {
// Проверяем, что пользователь с таким именем пользователя еще не зарегистрирован
var count int
err := db.QueryRow("SELECT COUNT(*) FROM users WHERE username = ?", username).Scan(&count)
if err != nil {
return err
}
if count > 0 {
return fmt.Errorf("Пользователь с именем пользователя %s уже существует", username)
}
// Сохраняем данные нового пользователя в таблице users
result, err := db.Exec("INSERT INTO users (username, password, email) VALUES (?, ?, ?)", username, password, email)
if err != nil {
return err
}
// Получаем ID нового пользователя
userID, err := result.LastInsertId()
if err != nil {
return err
}
// Получаем ID ролей из таблицы roles по их именам
var roleIDs []int
for _, roleName := range roles {
var roleID int
err := db.QueryRow("SELECT id FROM roles WHERE name = ?", roleName).Scan(&roleID)
if err != nil {
return err
}
roleIDs = append(roleIDs, roleID)
}
// Сохраняем связи пользователей и их ролей в таблице user_roles
for _, roleID := range roleIDs {
_, err := db.Exec("INSERT INTO user_roles (user_id, role_id) VALUES (?, ?)", userID, roleID)
if err != nil {
return err
}
}
return nil
}
func checkUserCredentials(db *sql.DB, username, password string) (bool, error) {
row := db.QueryRow("SELECT username, password FROM users WHERE username = ?", username)
var storedUsername, storedPassword string
err := row.Scan(&storedUsername, &storedPassword)
if err != nil {
if err == sql.ErrNoRows {
// Пользователь с указанным логином не найден, возвращаем false
return false, nil
}
// Возникла ошибка при выполнении запроса
return false, err
}
// Проверяем совпадение паролей
if storedPassword == password {
// Пароль верен, возвращаем true
return true, nil
}
// Неверный пароль, возвращаем false
return false, nil
}
func getUserRole(db *sql.DB, username string) string {
// Проверяем наличие роли у пользователя лениво
row := db.QueryRow("select name as role from users left join user_roles ur on users.id = ur.user_id left join roles r on r.id = ur.role_id where username=?", username)
var storedRole string
err := row.Scan(&storedRole)
if err != nil {
return "Ошибка при выполнении запроса"
}
return storedRole
}
func hasUserRole(db *sql.DB, username, role string) (bool, error) {
// Проверяем наличие роли у пользователя серьёзно
//query := "SELECT COUNT(*) FROM users WHERE username = ? AND role = ?"
query := "SELECT COUNT(*) FROM users left join user_roles on users.id = user_roles.user_id left join roles on user_roles.role_id = roles.id WHERE users.username = ? AND roles.name = ?"
var count int
err := db.QueryRow(query, username, role).Scan(&count)
if err != nil {
return false, err
}
return count > 0, nil
}
func GetUserProject(db *sql.DB, username string) (string, error) {
query := "SELECT projects.project_name " +
"FROM user_projects " +
"LEFT JOIN projects ON user_projects.project_id = projects.id " +
"LEFT JOIN users ON users.id = user_projects.user_id " +
"WHERE users.username = '" + username + "' AND user_projects.active = 1;"
var name string
err := db.QueryRow(query, username).Scan(&name)
if err != nil {
return "", err
}
return name, nil
}
func GetUserProjects(db *sql.DB, username string) ([]string, error) {
query := "SELECT projects.project_name " +
"FROM user_projects " +
"LEFT JOIN projects ON user_projects.project_id = projects.id " +
"LEFT JOIN users ON users.id = user_projects.user_id " +
"WHERE users.username = ? AND user_projects.active = 0;"
rows, err := db.Query(query, username)
if err != nil {
return nil, err
}
defer rows.Close()
var projectNames []string
for rows.Next() {
var projectName string
err := rows.Scan(&projectName)
if err != nil {
return nil, err
}
projectNames = append(projectNames, projectName)
}
if err := rows.Err(); err != nil {
return nil, err
}
return projectNames, nil
}
func GetAllProjects(db *sql.DB) ([]string, error) {
query := "SELECT project_name FROM projects;"
rows, err := db.Query(query)
if err != nil {
return nil, err
}
defer rows.Close()
var projectNames []string
for rows.Next() {
var projectName string
err := rows.Scan(&projectName)
if err != nil {
return nil, err
}
projectNames = append(projectNames, projectName)
}
if err := rows.Err(); err != nil {
return nil, err
}
return projectNames, nil
}
func SetActiveProject(db *sql.DB, username string, projectToActivate string) error {
// Сначала помечаем все проекты пользователя как неактивные
updateQuery := "UPDATE user_projects " +
"SET active = 0 " +
"WHERE user_id = (SELECT id FROM users WHERE username = ?)"
logrus.Debug("QW_1 = ", updateQuery, username)
_, err := db.Exec(updateQuery, username)
if err != nil {
return err
}
// Затем помечаем конкретный проект как активный
updateProjectQuery := "UPDATE user_projects " +
"SET active = 1 " +
"WHERE user_id = (SELECT id FROM users WHERE username = ?) " +
"AND project_id = (SELECT id FROM projects WHERE project_name = ?)"
logrus.Debug("QW_2 = ", updateProjectQuery, username, projectToActivate)
_, err = db.Exec(updateProjectQuery, username, projectToActivate)
if err != nil {
return err
}
return nil
}
// spec
func getDbConn() (db *sql.DB) {
db, err := createSQLiteDB()
if err != nil {
fmt.Println("Ошибка при создании базы данных:", err)
return
}
return db
}