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