package lib import ( "database/sql" "errors" "fmt" "time" ) type Room struct { ID string CreatedAt time.Time UserID string RoomName string TopicName string Visible bool Scale string } // CreateRoom creates a new room in the database. func CreateRoom(db *sql.DB, userID, roomName string) (*Room, error) { if db == nil { return nil, errors.New("database is not initialized") } // Generate a new ID for the room newRoomID := GenerateNewID("room") // Insert the new room into the database _, err := db.Exec( "INSERT INTO rooms (id, userid, roomname, topicname, visible, scale) VALUES (?, ?, ?, ?, ?, ?)", newRoomID, userID, roomName, "My First Topic", false, "0.5,1,2,3,5") if err != nil { return nil, err } return &Room{ ID: newRoomID, UserID: userID, RoomName: roomName, TopicName: "My First Topic", Visible: false, // Default visibility Scale: "0.5,1,2,3,5", // Default scale }, nil } // DeleteRoom deletes a room from the database by its ID. func DeleteRoom(db *sql.DB, roomID string) error { if db == nil { return errors.New("database is not initialized") } _, err := db.Exec( "DELETE FROM rooms WHERE id = ?", roomID) if err != nil { return err } return nil } // GetRoomsByUserID retrieves all rooms for a given userID. func GetRoomsByUserID(db *sql.DB, userID string) ([]Room, error) { if db == nil { return nil, errors.New("database is not initialized") } var rooms []Room rows, err := db.Query( "SELECT id, created_at, userid, roomname, topicname, visible, scale FROM rooms WHERE userid = ?", userID) if err != nil { return nil, err } defer rows.Close() for rows.Next() { var room Room err := rows.Scan(&room.ID, &room.CreatedAt, &room.UserID, &room.RoomName, &room.TopicName, &room.Visible, &room.Scale) if err != nil { return nil, err } rooms = append(rooms, room) } if err = rows.Err(); err != nil { return nil, err } return rooms, nil } // GetRoomById retrieves a room by its ID from the database. func GetRoomById(db *sql.DB, roomId string) (*Room, error) { if db == nil { return nil, errors.New("database is not initialized") } var room Room err := db.QueryRow( "SELECT id, created_at, userid, roomname, topicname, visible, scale FROM rooms WHERE id = ?", roomId).Scan(&room.ID, &room.CreatedAt, &room.UserID, &room.RoomName, &room.TopicName, &room.Visible, &room.Scale) if err != nil { if err == sql.ErrNoRows { return nil, fmt.Errorf("no room found with ID %s", roomId) } return nil, err } return &room, nil }