Add: Simple user login/register function

This commit is contained in:
2021-12-11 18:47:25 +08:00
parent c580ca245f
commit f3a95973e9
11 changed files with 379 additions and 13 deletions

View File

@@ -0,0 +1,31 @@
package database
func (database *Database) Login(username string, password string) (*User, error) {
user := &User{}
// get user from database
err := database.stmt.getUser.QueryRow(username, password).Scan(&user.ID, &user.Username, &user.Role, &user.AvatarId)
if err != nil {
return user, err
}
return user, nil
}
func (database *Database) LoginAsAnonymous() (*User, error) {
user := &User{}
// get user from database
err := database.stmt.getAnonymousUser.QueryRow().Scan(&user.ID, &user.Username, &user.Role, &user.AvatarId)
if err != nil {
return user, err
}
return user, nil
}
func (database *Database) Register(username string, password string, usertype int64) (error) {
_, err := database.stmt.insertUser.Exec(username, password, usertype, 0)
if err != nil {
return err
}
return nil
}

View File

@@ -25,10 +25,13 @@ var initFeedbacksTableQuery = `CREATE TABLE IF NOT EXISTS feedbacks (
header TEXT NOT NULL
);`
// User table schema definition
// role: 0 - Anonymous User, 1 - Admin, 2 - User
var initUsersTableQuery = `CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
username TEXT NOT NULL,
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
password TEXT NOT NULL,
role INTEGER NOT NULL,
avatar_id INTEGER NOT NULL,
FOREIGN KEY(avatar_id) REFERENCES avatars(id)
);`
@@ -153,6 +156,17 @@ LIMIT ?;`
var insertFeedbackQuery = `INSERT INTO feedbacks (time, feedback, header)
VALUES (?, ?, ?);`
var insertUserQuery = `INSERT INTO users (username, password, role, avatar_id)
VALUES (?, ?, ?, ?);`
var countUserQuery = `SELECT count(*) FROM users;`
var countAdminQuery = `SELECT count(*) FROM users WHERE role= 1;`
var getUserQuery = `SELECT id, username, role, avatar_id FROM users WHERE username = ? AND password = ? LIMIT 1;`
var getAnonymousUserQuery = `SELECT id, username, role, avatar_id FROM users WHERE role = 0 LIMIT 1;`
type Stmt struct {
initFilesTable *sql.Stmt
initFoldersTable *sql.Stmt
@@ -179,6 +193,11 @@ type Stmt struct {
getFilesInFolder *sql.Stmt
getRandomFiles *sql.Stmt
insertFeedback *sql.Stmt
insertUser *sql.Stmt
countUser *sql.Stmt
countAdmin *sql.Stmt
getUser *sql.Stmt
getAnonymousUser *sql.Stmt
}
func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) {
@@ -386,5 +405,48 @@ func NewPreparedStatement(sqlConn *sql.DB) (*Stmt, error) {
return nil, err
}
// init insertUser
stmt.insertUser, err = sqlConn.Prepare(insertUserQuery)
if err != nil {
return nil, err
}
// init countUser
stmt.countUser, err = sqlConn.Prepare(countUserQuery)
if err != nil {
return nil, err
}
// init countAdmin
stmt.countAdmin, err = sqlConn.Prepare(countAdminQuery)
if err != nil {
return nil, err
}
// init getUser
stmt.getUser, err = sqlConn.Prepare(getUserQuery)
if err != nil {
return nil, err
}
// init getAnonymousUser
stmt.getAnonymousUser, err = sqlConn.Prepare(getAnonymousUserQuery)
if err != nil {
return nil, err
}
// insert Anonymous user if users is empty
userCount := 0
err = stmt.countUser.QueryRow().Scan(&userCount)
if err != nil {
return nil, err
}
if userCount == 0 {
_, err = stmt.insertUser.Exec("Anonymous user", "", 0, 0)
if err != nil {
return nil, err
}
}
return stmt, err
}

View File

@@ -20,6 +20,14 @@ type Folder struct {
Foldername string `json:"foldername"`
}
type User struct {
ID int64 `json:"id"`
Username string `json:"username"`
Password string `json:"-"`
Role int64 `json:"role"`
AvatarId int64 `json:"avatar_id"`
}
func (f *File) Path() (string, error) {
folder, err := f.Db.GetFolder(f.Folder_id)
if err != nil {
@@ -27,4 +35,3 @@ func (f *File) Path() (string, error) {
}
return filepath.Join(folder.Folder, f.Filename), nil
}