Skip to content

Commit 46a0b0b

Browse files
committed
fix: update DiscoverDatabases endpoint to support all database types
- Add support for MySQL, MariaDB, and MongoDB discovery - Create DiscoverDatabasesRequest structure that accepts databaseType - Update endpoint to route to correct discovery method based on database type - Support both uppercase and lowercase database type values - Fix connection errors when adding databases via Discovery for non-PostgreSQL databases
1 parent 8f90c0e commit 46a0b0b

1 file changed

Lines changed: 117 additions & 8 deletions

File tree

backend/internal/features/databases/controller.go

Lines changed: 117 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import (
44
"context"
55
"log/slog"
66
"net/http"
7+
"postgresus-backend/internal/features/databases/databases/mariadb"
8+
"postgresus-backend/internal/features/databases/databases/mongodb"
9+
"postgresus-backend/internal/features/databases/databases/mysql"
710
"postgresus-backend/internal/features/databases/databases/postgresql"
811
"postgresus-backend/internal/features/servers"
912
users_middleware "postgresus-backend/internal/features/users/middleware"
@@ -421,12 +424,12 @@ func (c *DatabaseController) CreateReadOnlyUser(ctx *gin.Context) {
421424

422425
// DiscoverDatabases
423426
// @Summary Discover databases on a server
424-
// @Description Connect to a PostgreSQL server and list all available databases
427+
// @Description Connect to a database server (PostgreSQL, MySQL, MariaDB, or MongoDB) and list all available databases
425428
// @Tags databases
426429
// @Accept json
427430
// @Produce json
428-
// @Param request body postgresql.DiscoveryRequest true "Server connection data"
429-
// @Success 200 {array} postgresql.DatabaseInfo
431+
// @Param request body DiscoverDatabasesRequest true "Server connection data with database type"
432+
// @Success 200 {object} map[string]interface{} "Response contains 'databases' array"
430433
// @Failure 400
431434
// @Failure 401
432435
// @Router /databases/discover [post]
@@ -437,19 +440,125 @@ func (c *DatabaseController) DiscoverDatabases(ctx *gin.Context) {
437440
return
438441
}
439442

440-
var request postgresql.DiscoveryRequest
443+
var request DiscoverDatabasesRequest
441444
if err := ctx.ShouldBindJSON(&request); err != nil {
442445
ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
443446
return
444447
}
445448

446-
databases, err := postgresql.ListDatabasesOnServer(request)
447-
if err != nil {
448-
ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
449+
// Normalize database type (handle both uppercase and lowercase)
450+
dbType := request.DatabaseType
451+
switch dbType {
452+
case "postgres", "postgresql", "POSTGRES", "POSTGRESQL":
453+
req := postgresql.DiscoveryRequest{
454+
Host: request.Host,
455+
Port: request.Port,
456+
Username: request.Username,
457+
Password: request.Password,
458+
IsHttps: request.IsHttps,
459+
}
460+
databases, err := postgresql.ListDatabasesOnServer(req)
461+
if err != nil {
462+
ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
463+
return
464+
}
465+
// Convert to common format
466+
result := make([]map[string]interface{}, len(databases))
467+
for i, db := range databases {
468+
result[i] = map[string]interface{}{
469+
"name": db.Name,
470+
"size": db.Size,
471+
"owner": db.Owner,
472+
}
473+
}
474+
ctx.JSON(http.StatusOK, gin.H{"databases": result})
475+
476+
case "mysql", "MYSQL":
477+
req := mysql.DiscoveryRequest{
478+
Host: request.Host,
479+
Port: request.Port,
480+
Username: request.Username,
481+
Password: request.Password,
482+
IsHttps: request.IsHttps,
483+
}
484+
databases, err := mysql.ListDatabasesOnServer(req)
485+
if err != nil {
486+
ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
487+
return
488+
}
489+
// Convert to common format
490+
result := make([]map[string]interface{}, len(databases))
491+
for i, db := range databases {
492+
result[i] = map[string]interface{}{
493+
"name": db.Name,
494+
"size": db.Size,
495+
"owner": db.Owner,
496+
}
497+
}
498+
ctx.JSON(http.StatusOK, gin.H{"databases": result})
499+
500+
case "mariadb", "MARIADB":
501+
req := mariadb.DiscoveryRequest{
502+
Host: request.Host,
503+
Port: request.Port,
504+
Username: request.Username,
505+
Password: request.Password,
506+
IsHttps: request.IsHttps,
507+
}
508+
databases, err := mariadb.ListDatabasesOnServer(req)
509+
if err != nil {
510+
ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
511+
return
512+
}
513+
// Convert to common format
514+
result := make([]map[string]interface{}, len(databases))
515+
for i, db := range databases {
516+
result[i] = map[string]interface{}{
517+
"name": db.Name,
518+
"size": db.Size,
519+
"owner": db.Owner,
520+
}
521+
}
522+
ctx.JSON(http.StatusOK, gin.H{"databases": result})
523+
524+
case "mongodb", "MONGODB":
525+
req := mongodb.DiscoveryRequest{
526+
Host: request.Host,
527+
Port: request.Port,
528+
Username: request.Username,
529+
Password: request.Password,
530+
IsHttps: request.IsHttps,
531+
}
532+
databases, err := mongodb.ListDatabasesOnServer(req)
533+
if err != nil {
534+
ctx.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
535+
return
536+
}
537+
// Convert to common format
538+
result := make([]map[string]interface{}, len(databases))
539+
for i, db := range databases {
540+
result[i] = map[string]interface{}{
541+
"name": db.Name,
542+
"size": db.Size,
543+
"owner": db.Owner,
544+
}
545+
}
546+
ctx.JSON(http.StatusOK, gin.H{"databases": result})
547+
548+
default:
549+
ctx.JSON(http.StatusBadRequest, gin.H{"error": "unsupported database type: " + request.DatabaseType})
449550
return
450551
}
552+
}
451553

452-
ctx.JSON(http.StatusOK, gin.H{"databases": databases})
554+
// DiscoverDatabasesRequest represents request for database discovery
555+
type DiscoverDatabasesRequest struct {
556+
DatabaseType string `json:"databaseType"` // "postgres", "postgresql", "mysql", "mariadb", "mongodb"
557+
Host string `json:"host"`
558+
Port int `json:"port"`
559+
Username string `json:"username"`
560+
Password string `json:"password"`
561+
IsHttps bool `json:"isHttps"`
453562
}
454563

455564
// CreateDatabaseBatchRequest represents request for batch database creation

0 commit comments

Comments
 (0)