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:
BIN
Binary file not shown.
+10
-8
@@ -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
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user