Files

66 lines
2.0 KiB
Go

// VOR-05: Liste aller Akten mit Status- und Verantwortlicher-Filter fuer
// die workflow-eigene Uebersicht. Leerer Filterwert bedeutet "nicht
// filtern" auf dieser Dimension (Akzeptanzkriterium 1).
package caseobj
import (
"context"
"fmt"
)
// List liefert alle Akten dieses Mandanten, optional nach Status und/oder
// Verantwortlichem gefiltert. Der Status kommt aus der Statemachine-Engine
// (workflow_instances), nicht aus case_files selbst.
func (s *Service) List(ctx context.Context, status, responsible string) ([]Case, error) {
rows, err := s.pool.Query(ctx, `
SELECT cf.id, cf.instance_id, cf.case_number, cf.responsible, cf.created_at, wi.state
FROM case_files cf
JOIN workflow_instances wi ON wi.id = cf.instance_id
WHERE ($1 = '' OR wi.state = $1)
AND ($2 = '' OR cf.responsible = $2)
ORDER BY cf.created_at DESC
`, status, responsible)
if err != nil {
return nil, fmt.Errorf("caseobj: liste lesen: %w", err)
}
defer rows.Close()
var out []Case
var ids []string
for rows.Next() {
var c Case
if err := rows.Scan(&c.ID, &c.InstanceID, &c.CaseNumber, &c.Responsible, &c.CreatedAt, &c.Status); err != nil {
return nil, fmt.Errorf("caseobj: liste scannen: %w", err)
}
out = append(out, c)
ids = append(ids, c.ID)
}
if err := rows.Err(); err != nil {
return nil, fmt.Errorf("caseobj: liste iterieren: %w", err)
}
for i, id := range ids {
refRows, err := s.pool.Query(ctx, `
SELECT module_name, object_type, object_id FROM case_references
WHERE case_id = $1 ORDER BY created_at ASC
`, id)
if err != nil {
return nil, fmt.Errorf("caseobj: referenzen der liste lesen: %w", err)
}
for refRows.Next() {
var r Reference
if err := refRows.Scan(&r.ModuleName, &r.ObjectType, &r.ObjectID); err != nil {
refRows.Close()
return nil, fmt.Errorf("caseobj: referenz der liste lesen: %w", err)
}
out[i].References = append(out[i].References, r)
}
refErr := refRows.Err()
refRows.Close()
if refErr != nil {
return nil, fmt.Errorf("caseobj: referenzen der liste iterieren: %w", err)
}
}
return out, nil
}