Ctrl K
ComunidadGuías…

internal/repository/server_instance_postgres.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package repository

import (
	"context"
	"errors"
	"fmt"
	"xprem/internal/database"

	"github.com/google/uuid"
	"github.com/jackc/pgx/v5"
)

// PostgresServerInstanceRepository is the server_instance singleton: the
// deployment's permanent UUID, minted on first boot and immutable after.
type PostgresServerInstanceRepository struct {
	engine *database.Engine
}

func NewPostgresServerInstanceRepository(engine *database.Engine) *PostgresServerInstanceRepository {
	return &PostgresServerInstanceRepository{engine: engine}
}

// GetOrCreateInstanceID returns the persisted id, minting one first if the
// table is empty. A valid UUID seed is adopted instead of minting, so a
// deployment moving from stateless to DB mode keeps its bucket-minted id.
func (s *PostgresServerInstanceRepository) GetOrCreateInstanceID(ctx context.Context, seed string) (string, error) {
	existing, err := s.engine.Queries.GetServerInstanceID(ctx)
	if err == nil {
		return existing.String(), nil
	}
	if !errors.Is(err, pgx.ErrNoRows) {
		return "", fmt.Errorf("read server instance id: %w", err)
	}
	candidate := seed
	if _, parseErr := uuid.Parse(candidate); parseErr != nil {
		candidate = uuid.New().String()
	}
	minted, err := s.engine.Queries.InsertServerInstance(ctx, ToPgUUID(candidate))
	if err == nil {
		return minted.String(), nil
	}
	if !errors.Is(err, pgx.ErrNoRows) {
		return "", fmt.Errorf("mint server instance id: %w", err)
	}
	// ErrNoRows here means another replica won the first-boot insert race.
	existing, err = s.engine.Queries.GetServerInstanceID(ctx)
	if err != nil {
		return "", fmt.Errorf("read server instance id after lost race: %w", err)
	}
	return existing.String(), nil
}