Files

36 lines
1.5 KiB
Go
Raw Permalink Normal View History

package webevents
import (
"context"
"data-terminal-cloud/internal/identity"
"time"
)
// History only returns retained metadata from households the caller still belongs to.
func (s *Service) History(ctx context.Context, principal identity.Principal, since time.Time, limit int) ([]Event, error) {
if limit < 1 || limit > 200 {
limit = 200
}
rows, err := s.pool.Query(ctx, `SELECT we.id,we.event_type,h.public_id::text,we.resource_type,we.resource_public_id::text,COALESCE(sp.public_id::text,''),we.status,we.occurred_at
FROM web_event we JOIN household h ON h.id=we.household_id AND h.tenant_id=we.tenant_id AND h.status='active'
LEFT JOIN subject_profile sp ON sp.id=we.subject_id AND sp.tenant_id=we.tenant_id
WHERE we.occurred_at >= $3 AND we.expires_at>now() AND EXISTS (
SELECT 1 FROM household_member hm JOIN user_account ua ON ua.id=hm.user_id AND ua.tenant_id=hm.tenant_id AND ua.status='active'
JOIN tenant t ON t.id=ua.tenant_id AND t.status='active'
WHERE hm.tenant_id=we.tenant_id AND hm.household_id=we.household_id AND hm.status='active' AND ua.oidc_issuer=$1 AND ua.oidc_subject=$2)
ORDER BY we.id DESC LIMIT $4`, principal.Issuer, principal.Subject, since, limit)
if err != nil {
return nil, err
}
defer rows.Close()
items := make([]Event, 0)
for rows.Next() {
var item Event
if err := rows.Scan(&item.ID, &item.Type, &item.HouseholdID, &item.ResourceType, &item.ResourceID, &item.SubjectID, &item.Status, &item.OccurredAt); err != nil {
return nil, err
}
items = append(items, item)
}
return items, rows.Err()
}