feat(user): add createdAt field to user model

- Add createdAt field to User struct and database schema
- Update all user queries to include createdAt field
- Document new field in API documentation
- Fix server online status flag timing
This commit is contained in:
2026-03-10 14:34:16 +08:00
parent a142fb17a8
commit f3fca7f07b
4 changed files with 27 additions and 16 deletions
BIN
View File
Binary file not shown.
+10 -8
View File
@@ -18,6 +18,7 @@ type User struct {
Username string Username string
Passwd string Passwd string
Type string Type string
CreatedAt string
} }
func InitDatabase(dbPath string) error { func InitDatabase(dbPath string) error {
@@ -113,8 +114,8 @@ func GetUserByUsername(username string) (*User, error) {
} }
var user User var user User
err := db.QueryRow("SELECT userID, username, passwd, type FROM userLogin WHERE username = ?", username). err := db.QueryRow("SELECT userID, username, passwd, type, createdAt FROM userLogin WHERE username = ?", username).
Scan(&user.UserID, &user.Username, &user.Passwd, &user.Type) Scan(&user.UserID, &user.Username, &user.Passwd, &user.Type, &user.CreatedAt)
if err != nil { if err != nil {
if errors.Is(err, sql.ErrNoRows) { if errors.Is(err, sql.ErrNoRows) {
return nil, errors.New("user not found") return nil, errors.New("user not found")
@@ -127,8 +128,8 @@ func GetUserByUsername(username string) (*User, error) {
func GetUserByID(userID int) (*User, error) { func GetUserByID(userID int) (*User, error) {
var user User var user User
err := db.QueryRow("SELECT userID, username, passwd, type FROM userLogin WHERE userID = ?", userID). err := db.QueryRow("SELECT userID, username, passwd, type, createdAt FROM userLogin WHERE userID = ?", userID).
Scan(&user.UserID, &user.Username, &user.Passwd, &user.Type) Scan(&user.UserID, &user.Username, &user.Passwd, &user.Type, &user.CreatedAt)
if err != nil { if err != nil {
if errors.Is(err, sql.ErrNoRows) { if errors.Is(err, sql.ErrNoRows) {
return nil, errors.New("user not found") return nil, errors.New("user not found")
@@ -280,7 +281,8 @@ func InitUserDatabase(dbPath string) error {
userID INTEGER PRIMARY KEY AUTOINCREMENT, userID INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL, username TEXT UNIQUE NOT NULL,
passwd TEXT 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) _, err = db.Exec(createTableSQL)
@@ -292,7 +294,7 @@ func InitUserDatabase(dbPath string) error {
} }
func DBQueryUsers() ([]User, error) { // List all users 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 { if err != nil {
return nil, fmt.Errorf("failed to query users: %w", err) return nil, fmt.Errorf("failed to query users: %w", err)
} }
@@ -300,7 +302,7 @@ func DBQueryUsers() ([]User, error) { // List all users
var users []User var users []User
for rows.Next() { for rows.Next() {
var user User 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) return nil, fmt.Errorf("failed to scan user: %w", err)
} }
users = append(users, user) 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 func DBQuerySpecificUser(userID int) (User, error) { // Query user by ID
var user User 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 { if err != nil {
return user, fmt.Errorf("failed to query user: %w", err) return user, fmt.Errorf("failed to query user: %w", err)
} }
+11 -2
View File
@@ -299,17 +299,26 @@ X-Timestamp: 1704067200000
{ {
"userID": 1, "userID": 1,
"username": "admin", "username": "admin",
"type": "superuser" "type": "superuser",
"createdAt": "2024-01-01 12:00:00"
}, },
{ {
"userID": 2, "userID": 2,
"username": "new_user", "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 ## List Active Sessions
+1 -1
View File
@@ -89,10 +89,10 @@ func main() {
go func() { go func() {
postLog.Info(fmt.Sprintf("Server starting on %s", addr)) postLog.Info(fmt.Sprintf("Server starting on %s", addr))
isOnline = true
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed { if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
postLog.Fatal(fmt.Sprintf("Failed to start server: %v", err)) postLog.Fatal(fmt.Sprintf("Failed to start server: %v", err))
} }
isOnline = true
}() }()
go func() { go func() {