diff --git a/database.db b/database.db index 5e4106e..d82e70b 100644 Binary files a/database.db and b/database.db differ diff --git a/database.go b/database.go index b7863cc..31f9b20 100644 --- a/database.go +++ b/database.go @@ -14,10 +14,11 @@ import ( var db *sql.DB type User struct { - UserID int - Username string - Passwd string - Type string + UserID int + Username string + Passwd string + Type string + CreatedAt string } func InitDatabase(dbPath string) error { @@ -85,7 +86,7 @@ func AddUser(username, passwd, userType string) (int, error) { // New user regis return int(lastID), nil } -func RemoveUser (userID int) error { +func RemoveUser(userID int) error { if !isValidInput(strconv.Itoa(userID)) { return errors.New("invalid input: contains illegal characters") } @@ -113,8 +114,8 @@ func GetUserByUsername(username string) (*User, error) { } var user User - err := db.QueryRow("SELECT userID, username, passwd, type FROM userLogin WHERE username = ?", username). - Scan(&user.UserID, &user.Username, &user.Passwd, &user.Type) + err := db.QueryRow("SELECT userID, username, passwd, type, createdAt FROM userLogin WHERE username = ?", username). + Scan(&user.UserID, &user.Username, &user.Passwd, &user.Type, &user.CreatedAt) if err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, errors.New("user not found") @@ -127,8 +128,8 @@ func GetUserByUsername(username string) (*User, error) { func GetUserByID(userID int) (*User, error) { var user User - err := db.QueryRow("SELECT userID, username, passwd, type FROM userLogin WHERE userID = ?", userID). - Scan(&user.UserID, &user.Username, &user.Passwd, &user.Type) + err := db.QueryRow("SELECT userID, username, passwd, type, createdAt FROM userLogin WHERE userID = ?", userID). + Scan(&user.UserID, &user.Username, &user.Passwd, &user.Type, &user.CreatedAt) if err != nil { if errors.Is(err, sql.ErrNoRows) { return nil, errors.New("user not found") @@ -280,7 +281,8 @@ func InitUserDatabase(dbPath string) error { userID INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, passwd TEXT NOT NULL, - type TEXT NOT NULL DEFAULT 'visitor' + type TEXT NOT NULL DEFAULT 'visitor', + createdAt TEXT NOT NULL DEFAULT (datetime('now')) ); ` _, err = db.Exec(createTableSQL) @@ -292,7 +294,7 @@ func InitUserDatabase(dbPath string) error { } func DBQueryUsers() ([]User, error) { // List all users - rows, err := db.Query("SELECT userID, username, type FROM userLogin") + rows, err := db.Query("SELECT userID, username, type, createdAt FROM userLogin") if err != nil { return nil, fmt.Errorf("failed to query users: %w", err) } @@ -300,7 +302,7 @@ func DBQueryUsers() ([]User, error) { // List all users var users []User for rows.Next() { var user User - if err := rows.Scan(&user.UserID, &user.Username, &user.Type); err != nil { + if err := rows.Scan(&user.UserID, &user.Username, &user.Type, &user.CreatedAt); err != nil { return nil, fmt.Errorf("failed to scan user: %w", err) } users = append(users, user) @@ -315,7 +317,7 @@ func DBQueryUsers() ([]User, error) { // List all users func DBQuerySpecificUser(userID int) (User, error) { // Query user by ID var user User - err := db.QueryRow("SELECT userID, username, type FROM userLogin WHERE userID = ?", userID).Scan(&user.UserID, &user.Username, &user.Type) + err := db.QueryRow("SELECT userID, username, type, createdAt FROM userLogin WHERE userID = ?", userID).Scan(&user.UserID, &user.Username, &user.Type, &user.CreatedAt) if err != nil { return user, fmt.Errorf("failed to query user: %w", err) } diff --git a/docs/api.md b/docs/api.md index 2fd537b..132c605 100644 --- a/docs/api.md +++ b/docs/api.md @@ -299,17 +299,26 @@ X-Timestamp: 1704067200000 { "userID": 1, "username": "admin", - "type": "superuser" + "type": "superuser", + "createdAt": "2024-01-01 12:00:00" }, { "userID": 2, "username": "new_user", - "type": "admin" + "type": "admin", + "createdAt": "2024-01-02 14:30:00" } ] } ``` +| Field | Type | Description | +|-------|------|-------------| +| userID | int | User ID | +| username | string | Username | +| type | string | User type: superuser, admin, visitor | +| createdAt | string | User creation time (YYYY-MM-DD HH:MM:SS format) | + --- ## List Active Sessions diff --git a/main.go b/main.go index 0740e44..8a9052a 100644 --- a/main.go +++ b/main.go @@ -89,10 +89,10 @@ func main() { go func() { postLog.Info(fmt.Sprintf("Server starting on %s", addr)) + isOnline = true if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { postLog.Fatal(fmt.Sprintf("Failed to start server: %v", err)) } - isOnline = true }() go func() {