Files
nexarch/internal/usermatch/export.go
patrickandClaude Sonnet 5 8b87e97183 MAP-03: user-export-email-abgleich-tenant
Export der users-Tabellen aus archivmail/archivdms (internal/usermatch)
und E-Mail-Abgleich ausschliesslich innerhalb bereits per MAP-02
freigegebener Tenants (tenantapproval.Store.Approved()). Kandidatenliste
als CSV, kein automatischer Merge -- Freigabe bleibt MAP-04.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-14 20:03:57 +00:00

54 lines
1.7 KiB
Go

// Package usermatch implementiert MAP-03: Export der users-Tabellen aus
// archivmail und archivdms sowie den E-Mail-Abgleich innerhalb eines bereits
// per MAP-02/internal/tenantapproval freigegebenen Tenants.
package usermatch
import (
"context"
"fmt"
"github.com/jackc/pgx/v5/pgxpool"
)
// ExportedUser ist eine Zeile aus der users-Tabelle eines Altsystems.
type ExportedUser struct {
Source string
SourceID int64
TenantSourceID int64
Email string
Name string
PasswordHash string
}
// ExportUsers liest id/tenant_id/email/name/password_hash aus der
// users-Tabelle eines Altsystems. source identifiziert das Herkunftssystem
// ("archivmail" oder "archivdms").
func ExportUsers(ctx context.Context, pool *pgxpool.Pool, source string) ([]ExportedUser, error) {
rows, err := pool.Query(ctx, `SELECT id, tenant_id, email, name, password_hash FROM users ORDER BY id`)
if err != nil {
return nil, fmt.Errorf("users-export (%s): %w", source, err)
}
defer rows.Close()
var out []ExportedUser
for rows.Next() {
var e ExportedUser
if err := rows.Scan(&e.SourceID, &e.TenantSourceID, &e.Email, &e.Name, &e.PasswordHash); err != nil {
return nil, fmt.Errorf("users-zeile lesen (%s): %w", source, err)
}
e.Source = source
out = append(out, e)
}
return out, rows.Err()
}
// CountUsers liefert die Zeilenzahl der Quelltabelle, um die
// Export-Vollstaendigkeit zu pruefen (Pruefung 1 des Tickets).
func CountUsers(ctx context.Context, pool *pgxpool.Pool) (int, error) {
var n int
if err := pool.QueryRow(ctx, `SELECT count(*) FROM users`).Scan(&n); err != nil {
return 0, fmt.Errorf("users-zeilenzahl: %w", err)
}
return n, nil
}