forked from BasedHardware/omi
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathperson_aliases.py
More file actions
63 lines (52 loc) · 2.1 KB
/
Copy pathperson_aliases.py
File metadata and controls
63 lines (52 loc) · 2.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
"""Stable person rename and bounded exact-alias retention."""
from datetime import datetime, timezone
from typing import Any
from google.api_core.exceptions import NotFound
from google.cloud.firestore_v1 import transactional
def normalized_person_alias(value: Any) -> str | None:
if not isinstance(value, str):
return None
normalized = ' '.join(value.split()).strip()
if not normalized or len(normalized) > 128:
return None
return normalized
@transactional
def update_person_name_transaction(transaction: Any, person_ref: Any, name: str) -> bool:
"""Rename one stable person while retaining bounded exact aliases."""
snapshot = person_ref.get(transaction=transaction)
if not snapshot.exists:
return False
raw = snapshot.to_dict()
data = raw if isinstance(raw, dict) else {}
normalized_name = normalized_person_alias(name)
if normalized_name is None:
return False
aliases: list[str] = []
seen: set[str] = {normalized_name.casefold()}
stored_aliases = data.get('aliases')
if isinstance(stored_aliases, list):
for value in stored_aliases:
alias = normalized_person_alias(value)
if alias is None or alias.casefold() in seen:
continue
seen.add(alias.casefold())
aliases.append(alias)
prior_name = normalized_person_alias(data.get('name'))
if prior_name is not None and prior_name.casefold() not in seen:
aliases.append(prior_name)
transaction.update(
person_ref,
{
'name': normalized_name,
'aliases': aliases[-24:],
'updated_at': datetime.now(timezone.utc),
},
)
return True
def rename_person_retaining_aliases(db_client: Any, uid: str, person_id: str, name: str) -> bool:
"""Rename an owner-scoped person and map concurrent deletion to missing."""
person_ref = db_client.collection('users').document(uid).collection('people').document(person_id)
try:
return update_person_name_transaction(db_client.transaction(), person_ref, name)
except NotFound:
return False