package bundb import ( "context" "errors" "fmt" "gitea.dwysokinski.me/twhelp/sessions/internal/bundb/internal/model" "gitea.dwysokinski.me/twhelp/sessions/internal/domain" "github.com/jackc/pgerrcode" "github.com/uptrace/bun" "github.com/uptrace/bun/driver/pgdriver" ) type Session struct { db *bun.DB } func NewSession(db *bun.DB) *Session { return &Session{db: db} } func (u *Session) CreateOrUpdate(ctx context.Context, params domain.CreateSessionParams) (domain.Session, error) { sess := model.NewSession(params) if _, err := u.db.NewInsert(). Model(&sess). On("CONFLICT ON CONSTRAINT sessions_user_id_server_key_key DO UPDATE"). Set("sid = EXCLUDED.sid"). Set("updated_at = EXCLUDED.updated_at"). Returning("*"). Exec(ctx); err != nil { return domain.Session{}, fmt.Errorf( "something went wrong while inserting session into the db: %w", mapCreateSessionError(err, params), ) } return sess.ToDomain(), nil } func mapCreateSessionError(err error, params domain.CreateSessionParams) error { var pgError pgdriver.Error if !errors.As(err, &pgError) { return err } code := pgError.Field('C') constraint := pgError.Field('n') switch { case code == pgerrcode.ForeignKeyViolation && constraint == "sessions_user_id_fkey": return domain.UserDoesNotExistError{ ID: params.UserID(), } default: return err } }