36 lines
1.5 KiB
Go
36 lines
1.5 KiB
Go
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()
|
||
|
|
}
|