feat(profile): add round avatar with upload and cropping

- backend: user_avatar_objects binding (PG+SQLite), GC preserves avatar blobs,
  avatar service (EXIF-stripping WebP 128/512), public avatar read route
- web: avatar upload/crop on profile, round avatar in header/members/comments/author
- android: avatar upload/crop, round avatar on profile and albums header
- openspec: add-user-avatar proposal/design/specs/tasks
This commit is contained in:
iu
2026-10-12 16:16:47 +03:00
parent 657a04309e
commit 04617d1cdb
49 changed files with 2362 additions and 21 deletions
+5
View File
@@ -15,3 +15,8 @@ func objectKey(objectID, role, ext string) string {
}
return fmt.Sprintf("objects/%s/%s%s", objectID, role, ext)
}
// ObjectKey exposes the opaque storage-key format for callers outside the
// photos package that need to create their own journaled objects (for example
// user avatars). The key stays entity-free; only the caller knows the binding.
func ObjectKey(objectID, role, ext string) string { return objectKey(objectID, role, ext) }