diff --git a/backend/db/utils.go b/backend/db/utils.go new file mode 100644 index 0000000..2274099 --- /dev/null +++ b/backend/db/utils.go @@ -0,0 +1,53 @@ +package db + +import ( + "fmt" + "net/http" + "strconv" + "strings" +) + +// Convert "filter" URL param to SQL "WHERE" condition +func filterToSQL(filter string) (sql string, statusCode int, err error) { + // filterTokens := strings.Split(string(filter), ";") + sql = "(true)" + return +} + +// Convert "sort" URL param to SQL "ORDER BY" +func sortToSQL(sort string) (sql string, statusCode int, 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) + statusCode = http.StatusBadRequest + 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) + statusCode = http.StatusBadRequest + return + } + // add sorting option to query + if i > 0 { + sql += "," + } + sql += fmt.Sprintf("%s %s NULLS LAST", sortColumn, sortOrder) + } + return +}