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.
+15
-13
@@ -14,10 +14,11 @@ import (
|
|||||||
var db *sql.DB
|
var db *sql.DB
|
||||||
|
|
||||||
type User struct {
|
type User struct {
|
||||||
UserID int
|
UserID int
|
||||||
Username string
|
Username string
|
||||||
Passwd string
|
Passwd string
|
||||||
Type string
|
Type string
|
||||||
|
CreatedAt string
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitDatabase(dbPath string) error {
|
func InitDatabase(dbPath string) error {
|
||||||
@@ -85,7 +86,7 @@ func AddUser(username, passwd, userType string) (int, error) { // New user regis
|
|||||||
return int(lastID), nil
|
return int(lastID), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func RemoveUser (userID int) error {
|
func RemoveUser(userID int) error {
|
||||||
if !isValidInput(strconv.Itoa(userID)) {
|
if !isValidInput(strconv.Itoa(userID)) {
|
||||||
return errors.New("invalid input: contains illegal characters")
|
return errors.New("invalid input: contains illegal characters")
|
||||||
}
|
}
|
||||||
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user