83 lines
1.8 KiB
Go
83 lines
1.8 KiB
Go
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
|
|
}
|