summaryrefslogtreecommitdiff
path: root/src/srht_contrib/utils/identity.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/srht_contrib/utils/identity.py')
-rw-r--r--src/srht_contrib/utils/identity.py27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/srht_contrib/utils/identity.py b/src/srht_contrib/utils/identity.py
new file mode 100644
index 0000000..adc9a9d
--- /dev/null
+++ b/src/srht_contrib/utils/identity.py
@@ -0,0 +1,27 @@
+from __future__ import annotations
+
+from sqlalchemy import select
+from sqlalchemy.orm import Session
+
+from srht_contrib.models import ActorAlias
+
+
+class ActorIdentityResolver:
+ def __init__(self, configured_aliases: dict[str, list[str]] | None = None) -> None:
+ self.configured_aliases = configured_aliases or {}
+
+ def canonicalize(self, actor: str, db: Session | None = None) -> str:
+ normalized = actor.strip()
+ if not normalized:
+ return normalized
+
+ for canonical, aliases in self.configured_aliases.items():
+ if normalized == canonical or normalized in aliases:
+ return canonical
+
+ if db is not None:
+ alias = db.scalar(select(ActorAlias).where(ActorAlias.alias == normalized))
+ if alias is not None:
+ return alias.canonical_actor
+
+ return normalized