package handlers import ( "context" "net/http" "time" "go.mongodb.org/mongo-driver/v2/bson" "go.mongodb.org/mongo-driver/v2/mongo/options" "yh_web/server/config" "github.com/gin-gonic/gin" ) func GetWorkspaces(c *gin.Context) { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() coll := config.GetDB(config.DBName).Collection("workspaces") page := 1 pageSize := 20 if p := c.Query("page"); p != "" { if v, err := parseInt(p); err == nil && v > 0 { page = v } } if ps := c.Query("page_size"); ps != "" { if v, err := parseInt(ps); err == nil && v > 0 && v <= 100 { pageSize = v } } skip := (page - 1) * pageSize opts := options.Find().SetSkip(int64(skip)).SetLimit(int64(pageSize)).SetSort(bson.D{{Key: "_id", Value: -1}}) filter := bson.M{} if userID := c.Query("user_id"); userID != "" { filter["user_id"] = userID } cursor, err := coll.Find(ctx, filter, opts) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } defer cursor.Close(ctx) var list []map[string]interface{} if err = cursor.All(ctx, &list); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } total, _ := coll.CountDocuments(ctx, filter) c.JSON(http.StatusOK, gin.H{ "list": list, "total": total, "page": page, "page_size": pageSize, }) }