1. Move region seed into migration
2. Remove region seeding from API startup
3. Modify worker to:
- read REGION_NAME
- resolve region_id
- retry if not found
cd apps/api-go
migrate create -ext sql -dir migrations seed_region
20260225060018_seed_region.up.sql
-- Seed regions (idempotent)
INSERT INTO region (name)
VALUES
('ap-south-1'),
('us-east-1'),
('eu-west-1')
ON CONFLICT (name) DO NOTHING;
20260225060018_seed_region.down.sql
DELETE FROM region
WHERE name IN ('ap-south-1', 'us-east-1', 'eu-west-1');
migrate -database "postgres://postgres:postgres@localhost:5432/postgres?sslmode=disable" -path migrations up
internal/app/app.go
// if err := seed.SeedRegion(dbConn); err != nil {
// log.Fatal("failed to seed region:", err)
// }
After this, API becomes “pure app”, and static data lives in migrations.
internal/repository/region_repository.gopackage repository
import "context"
type RegionRepository interface {
GetRegionIDByName(ctx context.Context, name string) (string, error)
}
internal/repository/region_repository_pg.gopackage repository
import (
"context"
"database/sql"
"github.com/jmoiron/sqlx"
)
type regionRepository struct {
db *sqlx.DB
}
func NewRegionRepository(db *sqlx.DB) RegionRepository {
return ®ionRepository{db: db}
}
func (r *regionRepository) GetRegionIDByName(
ctx context.Context,
name string,
) (string, error) {
var regionID string
query := `
SELECT id FROM region
WHERE name = $1
`
err := r.db.QueryRowxContext(ctx, query, name).Scan(®ionID)
if err != nil {
if err == sql.ErrNoRows {
return "", err // let caller decide retry vs crash
}
return "", err
}
return regionID, nil
}
resolveRegionIDWithRetry function at worker monitoring startup