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
Passwd string
Type string
CreatedAt string
}
func InitDatabase(dbPath string) error {
@@ -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)
}
+11 -2
View File
@@ -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
+1 -1
View File
@@ -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() {