mirror of
https://github.com/memohai/Memoh.git
synced 2026-04-27 07:16:19 +09:00
670698090f
Catch unique constraint violation (SQLSTATE 23505) during route creation in ResolveConversation and fall back to Find, preventing duplicate key errors when concurrent inbound messages hit the same chat simultaneously. Add shared IsUniqueViolation helper to internal/db.
50 lines
1.1 KiB
Go
50 lines
1.1 KiB
Go
package db
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
"github.com/jackc/pgx/v5/pgconn"
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
)
|
|
|
|
// ParseUUID converts a string UUID to pgtype.UUID.
|
|
func ParseUUID(id string) (pgtype.UUID, error) {
|
|
parsed, err := uuid.Parse(strings.TrimSpace(id))
|
|
if err != nil {
|
|
return pgtype.UUID{}, fmt.Errorf("invalid UUID: %w", err)
|
|
}
|
|
var pgID pgtype.UUID
|
|
pgID.Valid = true
|
|
copy(pgID.Bytes[:], parsed[:])
|
|
return pgID, nil
|
|
}
|
|
|
|
// TimeFromPg converts a pgtype.Timestamptz to time.Time.
|
|
func TimeFromPg(value pgtype.Timestamptz) time.Time {
|
|
if value.Valid {
|
|
return value.Time
|
|
}
|
|
return time.Time{}
|
|
}
|
|
|
|
// TextToString returns the string value of pgtype.Text, or "" when invalid.
|
|
func TextToString(value pgtype.Text) string {
|
|
if !value.Valid {
|
|
return ""
|
|
}
|
|
return value.String
|
|
}
|
|
|
|
// IsUniqueViolation reports whether err is a PostgreSQL unique constraint violation (SQLSTATE 23505).
|
|
func IsUniqueViolation(err error) bool {
|
|
var pgErr *pgconn.PgError
|
|
if !errors.As(err, &pgErr) {
|
|
return false
|
|
}
|
|
return pgErr.Code == "23505"
|
|
}
|