package postgres import ( "errors" "fmt" "net/http" "strconv" "strings" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgconn" ) // Handle database error func handleDBError(errIn error) (statusCode int, err error) { if errIn == nil { statusCode = http.StatusOK return } if errors.Is(errIn, pgx.ErrNoRows) { err = fmt.Errorf("not found") statusCode = http.StatusNotFound return } var pgErr *pgconn.PgError if errors.As(errIn, &pgErr) { switch pgErr.Code { case "22P02", "22007": // Invalid data format err = fmt.Errorf("%s", pgErr.Message) statusCode = http.StatusBadRequest return case "23505": // Unique constraint violation err = fmt.Errorf("already exists") statusCode = http.StatusConflict return } } return http.StatusInternalServerError, errIn } // Convert "filter" URL param to SQL "WHERE" condition func filterToSQL(filter string) (sql string, err error) { // filterTokens := strings.Split(string(filter), ";") sql = "(true)" return } // Convert "sort" URL param to SQL "ORDER BY" func sortToSQL(sort string) (sql string, err error) { if sort == "" { return } sortOptions := strings.Split(sort, ",") sql = " ORDER BY " for i, sortOption := range sortOptions { sortOrder := sortOption[:1] sortColumn := sortOption[1:] // parse sorting order marker switch sortOrder { case "+": sortOrder = "ASC" case "-": sortOrder = "DESC" default: err = fmt.Errorf("invalid sorting order mark: %q", sortOrder) return } // validate sorting column var n int n, err = strconv.Atoi(sortColumn) if err != nil || n < 0 { err = fmt.Errorf("invalid sorting column: %q", sortColumn) return } // add sorting option to query if i > 0 { sql += "," } sql += fmt.Sprintf("%s %s NULLS LAST", sortColumn, sortOrder) } return }