Feat/profile editor performance improvements - #942

Merged
coodos merged 16 commits into
mainfrom
feat/profile-editor-performance-improvements
Apr 3, 2026
Merged

Feat/profile editor performance improvements#942
coodos merged 16 commits into
mainfrom
feat/profile-editor-performance-improvements

Conversation

@coodos

@coodoscoodos commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Description of change

improve performance on profile editor

Issue Number

Type of change

  • Update (a change which updates existing functionality)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

Release Notes

  • New Features

    • Added ability to browse public profiles without search queries
    • Added inline previews for CV (PDF viewer) and video introduction in profiles
    • Added admin profile viewing via URL parameter
  • Improvements

    • Enhanced search with debouncing for better performance
    • Implemented optimistic UI updates for privacy toggle
    • Improved profile field display—empty fields no longer render
    • Better file preview/download handling with automatic fallback
    • Refined profile card layout and spacing
  • Bug Fixes

    • Fixed conditional rendering in education and experience sections to hide empty entries

@coderabbitai

coderabbitaiBot commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ae7fc594-e8d6-41f3-928e-d3e63f6cd363

📥 Commits

Reviewing files that changed from the base of the PR and between 9a3a214 and 557e803.

📒 Files selected for processing (23)
  • infrastructure/evault-core/src/core/db/db.service.ts
  • infrastructure/evault-core/src/core/protocol/graphql-server.ts
  • platforms/profile-editor/api/src/controllers/DiscoveryController.ts
  • platforms/profile-editor/api/src/controllers/ProfileController.ts
  • platforms/profile-editor/api/src/controllers/WebhookController.ts
  • platforms/profile-editor/api/src/index.ts
  • platforms/profile-editor/api/src/services/EVaultProfileService.ts
  • platforms/profile-editor/api/src/services/EVaultSyncService.ts
  • platforms/profile-editor/api/src/services/RegistryService.ts
  • platforms/profile-editor/api/src/services/UserSearchService.ts
  • platforms/profile-editor/api/src/utils/file-proxy.ts
  • platforms/profile-editor/api/src/web3adapter/watchers/subscriber.ts
  • platforms/profile-editor/client/src/lib/components/profile/DocumentsSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/EducationSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ExperienceSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ProfileCard.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ProfileHeader.svelte
  • platforms/profile-editor/client/src/lib/stores/discovery.ts
  • platforms/profile-editor/client/src/lib/stores/profile.ts
  • platforms/profile-editor/client/src/lib/utils/file-manager.ts
  • platforms/profile-editor/client/src/routes/(protected)/discover/+page.svelte
  • platforms/profile-editor/client/src/routes/(protected)/profile/+page.svelte
  • platforms/profile-editor/client/src/routes/(protected)/settings/+page.svelte

📝 Walkthrough

Walkthrough

This PR introduces optimistic profile updates with background persistence, deduplicates overlapping envelope metadata, caches profile/registry data with TTL-based invalidation, refactors file proxy handling, enhances the discovery interface with public profile browsing, and adds admin impersonation and conditional asset preview/rendering across API and client.

Changes

Cohort / File(s)Summary
eVault Core Database & GraphQL
infrastructure/evault-core/src/core/db/db.service.ts, infrastructure/evault-core/src/core/protocol/graphql-server.ts
updateMetaEnvelopeById now deduplicates envelopes sharing the same ontology, switches from CREATE to MERGE for relationship construction with ON CREATE/MATCH SET logic, and logs duplicate counts. GraphQL responses for createMetaEnvelope and updateMetaEnvelope now populate parsed field from result envelopes rather than echoing input payload.
Profile API Controllers
platforms/profile-editor/api/src/controllers/DiscoveryController.ts, platforms/profile-editor/api/src/controllers/ProfileController.ts, platforms/profile-editor/api/src/controllers/WebhookController.ts, platforms/profile-editor/api/src/index.ts
Discovery endpoint now conditionally searches or lists public profiles based on query presence; default limit changed to 12. ProfileController adds sync service integration, resolves ename override via query parameter, replaces direct upsert with optimistic updates, refactors asset authorization, and wires sync service during initialization. WebhookController adds diagnostic logging.
Profile API Caching & Persistence Services
platforms/profile-editor/api/src/services/EVaultProfileService.ts, platforms/profile-editor/api/src/services/RegistryService.ts, platforms/profile-editor/api/src/services/UserSearchService.ts
EVaultProfileService introduces per-user caching with TTL, write queueing for serialization, and replaces upsertProfile with prepareUpdate returning a PreparedWrite with immediate cache update and deferred persistence. RegistryService caches resolveEName results (10-min TTL). UserSearchService adds listPublicUsers method for public profile discovery.
Profile API Search Sync & File Proxy
platforms/profile-editor/api/src/services/EVaultSyncService.ts, platforms/profile-editor/api/src/utils/file-proxy.ts, platforms/profile-editor/api/src/web3adapter/watchers/subscriber.ts
EVaultSyncService introduces syncUserToSearchDb to sync cached profiles asynchronously. File proxy replaces mode parameter with disposition, always attempts preview endpoint first, overrides cache headers to no-cache, and derives filenames from upstream headers. Subscriber adds table-change debug logging.
Profile Client Components
platforms/profile-editor/client/src/lib/components/profile/DocumentsSection.svelte, platforms/profile-editor/client/src/lib/components/profile/EducationSection.svelte, platforms/profile-editor/client/src/lib/components/profile/ExperienceSection.svelte, platforms/profile-editor/client/src/lib/components/profile/ProfileCard.svelte, platforms/profile-editor/client/src/lib/components/profile/ProfileHeader.svelte
Components add conditional rendering for empty fields (Education, Experience), preview UI for CV/video assets (Documents), centered avatar/card layout with multi-line headline clamping (ProfileCard), and local object URL previews for avatar/banner uploads with error state handling (ProfileHeader).
Profile Client Stores & Utils
platforms/profile-editor/client/src/lib/stores/discovery.ts, platforms/profile-editor/client/src/lib/stores/profile.ts, platforms/profile-editor/client/src/lib/utils/file-manager.ts, platforms/profile-editor/client/src/routes/(protected)/discover/+page.svelte, platforms/profile-editor/client/src/routes/(protected)/profile/+page.svelte, platforms/profile-editor/client/src/routes/(protected)/settings/+page.svelte
Discovery store conditionally includes q parameter. Profile store adds admin impersonation override accessors and appends query suffix to all profile mutations. File manager removes explicit Content-Type header for multipart uploads. Discover route adds debounced search, initial public profile load, and empty-state UI. Profile route reads as query parameter for admin override. Settings page performs optimistic UI update for public profile toggle with revert on failure.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • feat: idiomatic graphql api #769 — Directly modifies the same db.service.ts meta-envelope update logic and graphql-server.ts response construction that this PR refactors for deduplication and parsed-field population.

Suggested reviewers

  • sosweetham
  • ananyayaya129

Poem

🐰 Caches bloom and queues align,
Envelopes dedupe so fine!
Profiles preview, searched with care,
Async magic floats through air—
One hop closer, crystal clear! ✨

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/profile-editor-performance-improvements

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodos
coodos marked this pull request as ready for review April 3, 2026 09:48
@coodos
coodos merged commit 2416ed1 into mainApr 3, 2026
5 of 6 checks passed
@coodos
coodos deleted the feat/profile-editor-performance-improvements branch April 3, 2026 09:48
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 6, 2026
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Feat/profile editor performance improvements - #942

Merged
coodos merged 16 commits into
mainfrom
feat/profile-editor-performance-improvements
Apr 3, 2026
Merged

Feat/profile editor performance improvements#942
coodos merged 16 commits into
mainfrom
feat/profile-editor-performance-improvements

Conversation

@coodos

@coodoscoodos commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Description of change

improve performance on profile editor

Issue Number

Type of change

  • Update (a change which updates existing functionality)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

Release Notes

  • New Features

    • Added ability to browse public profiles without search queries
    • Added inline previews for CV (PDF viewer) and video introduction in profiles
    • Added admin profile viewing via URL parameter
  • Improvements

    • Enhanced search with debouncing for better performance
    • Implemented optimistic UI updates for privacy toggle
    • Improved profile field display—empty fields no longer render
    • Better file preview/download handling with automatic fallback
    • Refined profile card layout and spacing
  • Bug Fixes

    • Fixed conditional rendering in education and experience sections to hide empty entries

@coderabbitai

coderabbitaiBot commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ae7fc594-e8d6-41f3-928e-d3e63f6cd363

📥 Commits

Reviewing files that changed from the base of the PR and between 9a3a214 and 557e803.

📒 Files selected for processing (23)
  • infrastructure/evault-core/src/core/db/db.service.ts
  • infrastructure/evault-core/src/core/protocol/graphql-server.ts
  • platforms/profile-editor/api/src/controllers/DiscoveryController.ts
  • platforms/profile-editor/api/src/controllers/ProfileController.ts
  • platforms/profile-editor/api/src/controllers/WebhookController.ts
  • platforms/profile-editor/api/src/index.ts
  • platforms/profile-editor/api/src/services/EVaultProfileService.ts
  • platforms/profile-editor/api/src/services/EVaultSyncService.ts
  • platforms/profile-editor/api/src/services/RegistryService.ts
  • platforms/profile-editor/api/src/services/UserSearchService.ts
  • platforms/profile-editor/api/src/utils/file-proxy.ts
  • platforms/profile-editor/api/src/web3adapter/watchers/subscriber.ts
  • platforms/profile-editor/client/src/lib/components/profile/DocumentsSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/EducationSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ExperienceSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ProfileCard.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ProfileHeader.svelte
  • platforms/profile-editor/client/src/lib/stores/discovery.ts
  • platforms/profile-editor/client/src/lib/stores/profile.ts
  • platforms/profile-editor/client/src/lib/utils/file-manager.ts
  • platforms/profile-editor/client/src/routes/(protected)/discover/+page.svelte
  • platforms/profile-editor/client/src/routes/(protected)/profile/+page.svelte
  • platforms/profile-editor/client/src/routes/(protected)/settings/+page.svelte

📝 Walkthrough

Walkthrough

This PR introduces optimistic profile updates with background persistence, deduplicates overlapping envelope metadata, caches profile/registry data with TTL-based invalidation, refactors file proxy handling, enhances the discovery interface with public profile browsing, and adds admin impersonation and conditional asset preview/rendering across API and client.

Changes

Cohort / File(s)Summary
eVault Core Database & GraphQL
infrastructure/evault-core/src/core/db/db.service.ts, infrastructure/evault-core/src/core/protocol/graphql-server.ts
updateMetaEnvelopeById now deduplicates envelopes sharing the same ontology, switches from CREATE to MERGE for relationship construction with ON CREATE/MATCH SET logic, and logs duplicate counts. GraphQL responses for createMetaEnvelope and updateMetaEnvelope now populate parsed field from result envelopes rather than echoing input payload.
Profile API Controllers
platforms/profile-editor/api/src/controllers/DiscoveryController.ts, platforms/profile-editor/api/src/controllers/ProfileController.ts, platforms/profile-editor/api/src/controllers/WebhookController.ts, platforms/profile-editor/api/src/index.ts
Discovery endpoint now conditionally searches or lists public profiles based on query presence; default limit changed to 12. ProfileController adds sync service integration, resolves ename override via query parameter, replaces direct upsert with optimistic updates, refactors asset authorization, and wires sync service during initialization. WebhookController adds diagnostic logging.
Profile API Caching & Persistence Services
platforms/profile-editor/api/src/services/EVaultProfileService.ts, platforms/profile-editor/api/src/services/RegistryService.ts, platforms/profile-editor/api/src/services/UserSearchService.ts
EVaultProfileService introduces per-user caching with TTL, write queueing for serialization, and replaces upsertProfile with prepareUpdate returning a PreparedWrite with immediate cache update and deferred persistence. RegistryService caches resolveEName results (10-min TTL). UserSearchService adds listPublicUsers method for public profile discovery.
Profile API Search Sync & File Proxy
platforms/profile-editor/api/src/services/EVaultSyncService.ts, platforms/profile-editor/api/src/utils/file-proxy.ts, platforms/profile-editor/api/src/web3adapter/watchers/subscriber.ts
EVaultSyncService introduces syncUserToSearchDb to sync cached profiles asynchronously. File proxy replaces mode parameter with disposition, always attempts preview endpoint first, overrides cache headers to no-cache, and derives filenames from upstream headers. Subscriber adds table-change debug logging.
Profile Client Components
platforms/profile-editor/client/src/lib/components/profile/DocumentsSection.svelte, platforms/profile-editor/client/src/lib/components/profile/EducationSection.svelte, platforms/profile-editor/client/src/lib/components/profile/ExperienceSection.svelte, platforms/profile-editor/client/src/lib/components/profile/ProfileCard.svelte, platforms/profile-editor/client/src/lib/components/profile/ProfileHeader.svelte
Components add conditional rendering for empty fields (Education, Experience), preview UI for CV/video assets (Documents), centered avatar/card layout with multi-line headline clamping (ProfileCard), and local object URL previews for avatar/banner uploads with error state handling (ProfileHeader).
Profile Client Stores & Utils
platforms/profile-editor/client/src/lib/stores/discovery.ts, platforms/profile-editor/client/src/lib/stores/profile.ts, platforms/profile-editor/client/src/lib/utils/file-manager.ts, platforms/profile-editor/client/src/routes/(protected)/discover/+page.svelte, platforms/profile-editor/client/src/routes/(protected)/profile/+page.svelte, platforms/profile-editor/client/src/routes/(protected)/settings/+page.svelte
Discovery store conditionally includes q parameter. Profile store adds admin impersonation override accessors and appends query suffix to all profile mutations. File manager removes explicit Content-Type header for multipart uploads. Discover route adds debounced search, initial public profile load, and empty-state UI. Profile route reads as query parameter for admin override. Settings page performs optimistic UI update for public profile toggle with revert on failure.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • feat: idiomatic graphql api #769 — Directly modifies the same db.service.ts meta-envelope update logic and graphql-server.ts response construction that this PR refactors for deduplication and parsed-field population.

Suggested reviewers

  • sosweetham
  • ananyayaya129

Poem

🐰 Caches bloom and queues align,
Envelopes dedupe so fine!
Profiles preview, searched with care,
Async magic floats through air—
One hop closer, crystal clear! ✨

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/profile-editor-performance-improvements

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodos
coodos marked this pull request as ready for review April 3, 2026 09:48
@coodos
coodos merged commit 2416ed1 into mainApr 3, 2026
5 of 6 checks passed
@coodos
coodos deleted the feat/profile-editor-performance-improvements branch April 3, 2026 09:48
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 6, 2026
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Feat/profile editor performance improvements - #942

Merged
coodos merged 16 commits into
mainfrom
feat/profile-editor-performance-improvements
Apr 3, 2026
Merged

Feat/profile editor performance improvements#942
coodos merged 16 commits into
mainfrom
feat/profile-editor-performance-improvements

Conversation

@coodos

@coodoscoodos commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Description of change

improve performance on profile editor

Issue Number

Type of change

  • Update (a change which updates existing functionality)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

Release Notes

  • New Features

    • Added ability to browse public profiles without search queries
    • Added inline previews for CV (PDF viewer) and video introduction in profiles
    • Added admin profile viewing via URL parameter
  • Improvements

    • Enhanced search with debouncing for better performance
    • Implemented optimistic UI updates for privacy toggle
    • Improved profile field display—empty fields no longer render
    • Better file preview/download handling with automatic fallback
    • Refined profile card layout and spacing
  • Bug Fixes

    • Fixed conditional rendering in education and experience sections to hide empty entries

@coderabbitai

coderabbitaiBot commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ae7fc594-e8d6-41f3-928e-d3e63f6cd363

📥 Commits

Reviewing files that changed from the base of the PR and between 9a3a214 and 557e803.

📒 Files selected for processing (23)
  • infrastructure/evault-core/src/core/db/db.service.ts
  • infrastructure/evault-core/src/core/protocol/graphql-server.ts
  • platforms/profile-editor/api/src/controllers/DiscoveryController.ts
  • platforms/profile-editor/api/src/controllers/ProfileController.ts
  • platforms/profile-editor/api/src/controllers/WebhookController.ts
  • platforms/profile-editor/api/src/index.ts
  • platforms/profile-editor/api/src/services/EVaultProfileService.ts
  • platforms/profile-editor/api/src/services/EVaultSyncService.ts
  • platforms/profile-editor/api/src/services/RegistryService.ts
  • platforms/profile-editor/api/src/services/UserSearchService.ts
  • platforms/profile-editor/api/src/utils/file-proxy.ts
  • platforms/profile-editor/api/src/web3adapter/watchers/subscriber.ts
  • platforms/profile-editor/client/src/lib/components/profile/DocumentsSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/EducationSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ExperienceSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ProfileCard.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ProfileHeader.svelte
  • platforms/profile-editor/client/src/lib/stores/discovery.ts
  • platforms/profile-editor/client/src/lib/stores/profile.ts
  • platforms/profile-editor/client/src/lib/utils/file-manager.ts
  • platforms/profile-editor/client/src/routes/(protected)/discover/+page.svelte
  • platforms/profile-editor/client/src/routes/(protected)/profile/+page.svelte
  • platforms/profile-editor/client/src/routes/(protected)/settings/+page.svelte

📝 Walkthrough

Walkthrough

This PR introduces optimistic profile updates with background persistence, deduplicates overlapping envelope metadata, caches profile/registry data with TTL-based invalidation, refactors file proxy handling, enhances the discovery interface with public profile browsing, and adds admin impersonation and conditional asset preview/rendering across API and client.

Changes

Cohort / File(s)Summary
eVault Core Database & GraphQL
infrastructure/evault-core/src/core/db/db.service.ts, infrastructure/evault-core/src/core/protocol/graphql-server.ts
updateMetaEnvelopeById now deduplicates envelopes sharing the same ontology, switches from CREATE to MERGE for relationship construction with ON CREATE/MATCH SET logic, and logs duplicate counts. GraphQL responses for createMetaEnvelope and updateMetaEnvelope now populate parsed field from result envelopes rather than echoing input payload.
Profile API Controllers
platforms/profile-editor/api/src/controllers/DiscoveryController.ts, platforms/profile-editor/api/src/controllers/ProfileController.ts, platforms/profile-editor/api/src/controllers/WebhookController.ts, platforms/profile-editor/api/src/index.ts
Discovery endpoint now conditionally searches or lists public profiles based on query presence; default limit changed to 12. ProfileController adds sync service integration, resolves ename override via query parameter, replaces direct upsert with optimistic updates, refactors asset authorization, and wires sync service during initialization. WebhookController adds diagnostic logging.
Profile API Caching & Persistence Services
platforms/profile-editor/api/src/services/EVaultProfileService.ts, platforms/profile-editor/api/src/services/RegistryService.ts, platforms/profile-editor/api/src/services/UserSearchService.ts
EVaultProfileService introduces per-user caching with TTL, write queueing for serialization, and replaces upsertProfile with prepareUpdate returning a PreparedWrite with immediate cache update and deferred persistence. RegistryService caches resolveEName results (10-min TTL). UserSearchService adds listPublicUsers method for public profile discovery.
Profile API Search Sync & File Proxy
platforms/profile-editor/api/src/services/EVaultSyncService.ts, platforms/profile-editor/api/src/utils/file-proxy.ts, platforms/profile-editor/api/src/web3adapter/watchers/subscriber.ts
EVaultSyncService introduces syncUserToSearchDb to sync cached profiles asynchronously. File proxy replaces mode parameter with disposition, always attempts preview endpoint first, overrides cache headers to no-cache, and derives filenames from upstream headers. Subscriber adds table-change debug logging.
Profile Client Components
platforms/profile-editor/client/src/lib/components/profile/DocumentsSection.svelte, platforms/profile-editor/client/src/lib/components/profile/EducationSection.svelte, platforms/profile-editor/client/src/lib/components/profile/ExperienceSection.svelte, platforms/profile-editor/client/src/lib/components/profile/ProfileCard.svelte, platforms/profile-editor/client/src/lib/components/profile/ProfileHeader.svelte
Components add conditional rendering for empty fields (Education, Experience), preview UI for CV/video assets (Documents), centered avatar/card layout with multi-line headline clamping (ProfileCard), and local object URL previews for avatar/banner uploads with error state handling (ProfileHeader).
Profile Client Stores & Utils
platforms/profile-editor/client/src/lib/stores/discovery.ts, platforms/profile-editor/client/src/lib/stores/profile.ts, platforms/profile-editor/client/src/lib/utils/file-manager.ts, platforms/profile-editor/client/src/routes/(protected)/discover/+page.svelte, platforms/profile-editor/client/src/routes/(protected)/profile/+page.svelte, platforms/profile-editor/client/src/routes/(protected)/settings/+page.svelte
Discovery store conditionally includes q parameter. Profile store adds admin impersonation override accessors and appends query suffix to all profile mutations. File manager removes explicit Content-Type header for multipart uploads. Discover route adds debounced search, initial public profile load, and empty-state UI. Profile route reads as query parameter for admin override. Settings page performs optimistic UI update for public profile toggle with revert on failure.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • feat: idiomatic graphql api #769 — Directly modifies the same db.service.ts meta-envelope update logic and graphql-server.ts response construction that this PR refactors for deduplication and parsed-field population.

Suggested reviewers

  • sosweetham
  • ananyayaya129

Poem

🐰 Caches bloom and queues align,
Envelopes dedupe so fine!
Profiles preview, searched with care,
Async magic floats through air—
One hop closer, crystal clear! ✨

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/profile-editor-performance-improvements

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodos
coodos marked this pull request as ready for review April 3, 2026 09:48
@coodos
coodos merged commit 2416ed1 into mainApr 3, 2026
5 of 6 checks passed
@coodos
coodos deleted the feat/profile-editor-performance-improvements branch April 3, 2026 09:48
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 6, 2026
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Feat/profile editor performance improvements - #942

Merged
coodos merged 16 commits into
mainfrom
feat/profile-editor-performance-improvements
Apr 3, 2026
Merged

Feat/profile editor performance improvements#942
coodos merged 16 commits into
mainfrom
feat/profile-editor-performance-improvements

Conversation

@coodos

@coodoscoodos commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Description of change

improve performance on profile editor

Issue Number

Type of change

  • Update (a change which updates existing functionality)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

Release Notes

  • New Features

    • Added ability to browse public profiles without search queries
    • Added inline previews for CV (PDF viewer) and video introduction in profiles
    • Added admin profile viewing via URL parameter
  • Improvements

    • Enhanced search with debouncing for better performance
    • Implemented optimistic UI updates for privacy toggle
    • Improved profile field display—empty fields no longer render
    • Better file preview/download handling with automatic fallback
    • Refined profile card layout and spacing
  • Bug Fixes

    • Fixed conditional rendering in education and experience sections to hide empty entries

@coderabbitai

coderabbitaiBot commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ae7fc594-e8d6-41f3-928e-d3e63f6cd363

📥 Commits

Reviewing files that changed from the base of the PR and between 9a3a214 and 557e803.

📒 Files selected for processing (23)
  • infrastructure/evault-core/src/core/db/db.service.ts
  • infrastructure/evault-core/src/core/protocol/graphql-server.ts
  • platforms/profile-editor/api/src/controllers/DiscoveryController.ts
  • platforms/profile-editor/api/src/controllers/ProfileController.ts
  • platforms/profile-editor/api/src/controllers/WebhookController.ts
  • platforms/profile-editor/api/src/index.ts
  • platforms/profile-editor/api/src/services/EVaultProfileService.ts
  • platforms/profile-editor/api/src/services/EVaultSyncService.ts
  • platforms/profile-editor/api/src/services/RegistryService.ts
  • platforms/profile-editor/api/src/services/UserSearchService.ts
  • platforms/profile-editor/api/src/utils/file-proxy.ts
  • platforms/profile-editor/api/src/web3adapter/watchers/subscriber.ts
  • platforms/profile-editor/client/src/lib/components/profile/DocumentsSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/EducationSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ExperienceSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ProfileCard.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ProfileHeader.svelte
  • platforms/profile-editor/client/src/lib/stores/discovery.ts
  • platforms/profile-editor/client/src/lib/stores/profile.ts
  • platforms/profile-editor/client/src/lib/utils/file-manager.ts
  • platforms/profile-editor/client/src/routes/(protected)/discover/+page.svelte
  • platforms/profile-editor/client/src/routes/(protected)/profile/+page.svelte
  • platforms/profile-editor/client/src/routes/(protected)/settings/+page.svelte

📝 Walkthrough

Walkthrough

This PR introduces optimistic profile updates with background persistence, deduplicates overlapping envelope metadata, caches profile/registry data with TTL-based invalidation, refactors file proxy handling, enhances the discovery interface with public profile browsing, and adds admin impersonation and conditional asset preview/rendering across API and client.

Changes

Cohort / File(s)Summary
eVault Core Database & GraphQL
infrastructure/evault-core/src/core/db/db.service.ts, infrastructure/evault-core/src/core/protocol/graphql-server.ts
updateMetaEnvelopeById now deduplicates envelopes sharing the same ontology, switches from CREATE to MERGE for relationship construction with ON CREATE/MATCH SET logic, and logs duplicate counts. GraphQL responses for createMetaEnvelope and updateMetaEnvelope now populate parsed field from result envelopes rather than echoing input payload.
Profile API Controllers
platforms/profile-editor/api/src/controllers/DiscoveryController.ts, platforms/profile-editor/api/src/controllers/ProfileController.ts, platforms/profile-editor/api/src/controllers/WebhookController.ts, platforms/profile-editor/api/src/index.ts
Discovery endpoint now conditionally searches or lists public profiles based on query presence; default limit changed to 12. ProfileController adds sync service integration, resolves ename override via query parameter, replaces direct upsert with optimistic updates, refactors asset authorization, and wires sync service during initialization. WebhookController adds diagnostic logging.
Profile API Caching & Persistence Services
platforms/profile-editor/api/src/services/EVaultProfileService.ts, platforms/profile-editor/api/src/services/RegistryService.ts, platforms/profile-editor/api/src/services/UserSearchService.ts
EVaultProfileService introduces per-user caching with TTL, write queueing for serialization, and replaces upsertProfile with prepareUpdate returning a PreparedWrite with immediate cache update and deferred persistence. RegistryService caches resolveEName results (10-min TTL). UserSearchService adds listPublicUsers method for public profile discovery.
Profile API Search Sync & File Proxy
platforms/profile-editor/api/src/services/EVaultSyncService.ts, platforms/profile-editor/api/src/utils/file-proxy.ts, platforms/profile-editor/api/src/web3adapter/watchers/subscriber.ts
EVaultSyncService introduces syncUserToSearchDb to sync cached profiles asynchronously. File proxy replaces mode parameter with disposition, always attempts preview endpoint first, overrides cache headers to no-cache, and derives filenames from upstream headers. Subscriber adds table-change debug logging.
Profile Client Components
platforms/profile-editor/client/src/lib/components/profile/DocumentsSection.svelte, platforms/profile-editor/client/src/lib/components/profile/EducationSection.svelte, platforms/profile-editor/client/src/lib/components/profile/ExperienceSection.svelte, platforms/profile-editor/client/src/lib/components/profile/ProfileCard.svelte, platforms/profile-editor/client/src/lib/components/profile/ProfileHeader.svelte
Components add conditional rendering for empty fields (Education, Experience), preview UI for CV/video assets (Documents), centered avatar/card layout with multi-line headline clamping (ProfileCard), and local object URL previews for avatar/banner uploads with error state handling (ProfileHeader).
Profile Client Stores & Utils
platforms/profile-editor/client/src/lib/stores/discovery.ts, platforms/profile-editor/client/src/lib/stores/profile.ts, platforms/profile-editor/client/src/lib/utils/file-manager.ts, platforms/profile-editor/client/src/routes/(protected)/discover/+page.svelte, platforms/profile-editor/client/src/routes/(protected)/profile/+page.svelte, platforms/profile-editor/client/src/routes/(protected)/settings/+page.svelte
Discovery store conditionally includes q parameter. Profile store adds admin impersonation override accessors and appends query suffix to all profile mutations. File manager removes explicit Content-Type header for multipart uploads. Discover route adds debounced search, initial public profile load, and empty-state UI. Profile route reads as query parameter for admin override. Settings page performs optimistic UI update for public profile toggle with revert on failure.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • feat: idiomatic graphql api #769 — Directly modifies the same db.service.ts meta-envelope update logic and graphql-server.ts response construction that this PR refactors for deduplication and parsed-field population.

Suggested reviewers

  • sosweetham
  • ananyayaya129

Poem

🐰 Caches bloom and queues align,
Envelopes dedupe so fine!
Profiles preview, searched with care,
Async magic floats through air—
One hop closer, crystal clear! ✨

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/profile-editor-performance-improvements

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodos
coodos marked this pull request as ready for review April 3, 2026 09:48
@coodos
coodos merged commit 2416ed1 into mainApr 3, 2026
5 of 6 checks passed
@coodos
coodos deleted the feat/profile-editor-performance-improvements branch April 3, 2026 09:48
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 6, 2026
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Feat/profile editor performance improvements - #942

Merged
coodos merged 16 commits into
mainfrom
feat/profile-editor-performance-improvements
Apr 3, 2026
Merged

Feat/profile editor performance improvements#942
coodos merged 16 commits into
mainfrom
feat/profile-editor-performance-improvements

Conversation

@coodos

@coodoscoodos commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Description of change

improve performance on profile editor

Issue Number

Type of change

  • Update (a change which updates existing functionality)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

Release Notes

  • New Features

    • Added ability to browse public profiles without search queries
    • Added inline previews for CV (PDF viewer) and video introduction in profiles
    • Added admin profile viewing via URL parameter
  • Improvements

    • Enhanced search with debouncing for better performance
    • Implemented optimistic UI updates for privacy toggle
    • Improved profile field display—empty fields no longer render
    • Better file preview/download handling with automatic fallback
    • Refined profile card layout and spacing
  • Bug Fixes

    • Fixed conditional rendering in education and experience sections to hide empty entries

@coderabbitai

coderabbitaiBot commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ae7fc594-e8d6-41f3-928e-d3e63f6cd363

📥 Commits

Reviewing files that changed from the base of the PR and between 9a3a214 and 557e803.

📒 Files selected for processing (23)
  • infrastructure/evault-core/src/core/db/db.service.ts
  • infrastructure/evault-core/src/core/protocol/graphql-server.ts
  • platforms/profile-editor/api/src/controllers/DiscoveryController.ts
  • platforms/profile-editor/api/src/controllers/ProfileController.ts
  • platforms/profile-editor/api/src/controllers/WebhookController.ts
  • platforms/profile-editor/api/src/index.ts
  • platforms/profile-editor/api/src/services/EVaultProfileService.ts
  • platforms/profile-editor/api/src/services/EVaultSyncService.ts
  • platforms/profile-editor/api/src/services/RegistryService.ts
  • platforms/profile-editor/api/src/services/UserSearchService.ts
  • platforms/profile-editor/api/src/utils/file-proxy.ts
  • platforms/profile-editor/api/src/web3adapter/watchers/subscriber.ts
  • platforms/profile-editor/client/src/lib/components/profile/DocumentsSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/EducationSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ExperienceSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ProfileCard.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ProfileHeader.svelte
  • platforms/profile-editor/client/src/lib/stores/discovery.ts
  • platforms/profile-editor/client/src/lib/stores/profile.ts
  • platforms/profile-editor/client/src/lib/utils/file-manager.ts
  • platforms/profile-editor/client/src/routes/(protected)/discover/+page.svelte
  • platforms/profile-editor/client/src/routes/(protected)/profile/+page.svelte
  • platforms/profile-editor/client/src/routes/(protected)/settings/+page.svelte

📝 Walkthrough

Walkthrough

This PR introduces optimistic profile updates with background persistence, deduplicates overlapping envelope metadata, caches profile/registry data with TTL-based invalidation, refactors file proxy handling, enhances the discovery interface with public profile browsing, and adds admin impersonation and conditional asset preview/rendering across API and client.

Changes

Cohort / File(s)Summary
eVault Core Database & GraphQL
infrastructure/evault-core/src/core/db/db.service.ts, infrastructure/evault-core/src/core/protocol/graphql-server.ts
updateMetaEnvelopeById now deduplicates envelopes sharing the same ontology, switches from CREATE to MERGE for relationship construction with ON CREATE/MATCH SET logic, and logs duplicate counts. GraphQL responses for createMetaEnvelope and updateMetaEnvelope now populate parsed field from result envelopes rather than echoing input payload.
Profile API Controllers
platforms/profile-editor/api/src/controllers/DiscoveryController.ts, platforms/profile-editor/api/src/controllers/ProfileController.ts, platforms/profile-editor/api/src/controllers/WebhookController.ts, platforms/profile-editor/api/src/index.ts
Discovery endpoint now conditionally searches or lists public profiles based on query presence; default limit changed to 12. ProfileController adds sync service integration, resolves ename override via query parameter, replaces direct upsert with optimistic updates, refactors asset authorization, and wires sync service during initialization. WebhookController adds diagnostic logging.
Profile API Caching & Persistence Services
platforms/profile-editor/api/src/services/EVaultProfileService.ts, platforms/profile-editor/api/src/services/RegistryService.ts, platforms/profile-editor/api/src/services/UserSearchService.ts
EVaultProfileService introduces per-user caching with TTL, write queueing for serialization, and replaces upsertProfile with prepareUpdate returning a PreparedWrite with immediate cache update and deferred persistence. RegistryService caches resolveEName results (10-min TTL). UserSearchService adds listPublicUsers method for public profile discovery.
Profile API Search Sync & File Proxy
platforms/profile-editor/api/src/services/EVaultSyncService.ts, platforms/profile-editor/api/src/utils/file-proxy.ts, platforms/profile-editor/api/src/web3adapter/watchers/subscriber.ts
EVaultSyncService introduces syncUserToSearchDb to sync cached profiles asynchronously. File proxy replaces mode parameter with disposition, always attempts preview endpoint first, overrides cache headers to no-cache, and derives filenames from upstream headers. Subscriber adds table-change debug logging.
Profile Client Components
platforms/profile-editor/client/src/lib/components/profile/DocumentsSection.svelte, platforms/profile-editor/client/src/lib/components/profile/EducationSection.svelte, platforms/profile-editor/client/src/lib/components/profile/ExperienceSection.svelte, platforms/profile-editor/client/src/lib/components/profile/ProfileCard.svelte, platforms/profile-editor/client/src/lib/components/profile/ProfileHeader.svelte
Components add conditional rendering for empty fields (Education, Experience), preview UI for CV/video assets (Documents), centered avatar/card layout with multi-line headline clamping (ProfileCard), and local object URL previews for avatar/banner uploads with error state handling (ProfileHeader).
Profile Client Stores & Utils
platforms/profile-editor/client/src/lib/stores/discovery.ts, platforms/profile-editor/client/src/lib/stores/profile.ts, platforms/profile-editor/client/src/lib/utils/file-manager.ts, platforms/profile-editor/client/src/routes/(protected)/discover/+page.svelte, platforms/profile-editor/client/src/routes/(protected)/profile/+page.svelte, platforms/profile-editor/client/src/routes/(protected)/settings/+page.svelte
Discovery store conditionally includes q parameter. Profile store adds admin impersonation override accessors and appends query suffix to all profile mutations. File manager removes explicit Content-Type header for multipart uploads. Discover route adds debounced search, initial public profile load, and empty-state UI. Profile route reads as query parameter for admin override. Settings page performs optimistic UI update for public profile toggle with revert on failure.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • feat: idiomatic graphql api #769 — Directly modifies the same db.service.ts meta-envelope update logic and graphql-server.ts response construction that this PR refactors for deduplication and parsed-field population.

Suggested reviewers

  • sosweetham
  • ananyayaya129

Poem

🐰 Caches bloom and queues align,
Envelopes dedupe so fine!
Profiles preview, searched with care,
Async magic floats through air—
One hop closer, crystal clear! ✨

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/profile-editor-performance-improvements

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodos
coodos marked this pull request as ready for review April 3, 2026 09:48
@coodos
coodos merged commit 2416ed1 into mainApr 3, 2026
5 of 6 checks passed
@coodos
coodos deleted the feat/profile-editor-performance-improvements branch April 3, 2026 09:48
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 6, 2026
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Feat/profile editor performance improvements - #942

Merged
coodos merged 16 commits into
mainfrom
feat/profile-editor-performance-improvements
Apr 3, 2026
Merged

Feat/profile editor performance improvements#942
coodos merged 16 commits into
mainfrom
feat/profile-editor-performance-improvements

Conversation

@coodos

@coodoscoodos commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Description of change

improve performance on profile editor

Issue Number

Type of change

  • Update (a change which updates existing functionality)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

Release Notes

  • New Features

    • Added ability to browse public profiles without search queries
    • Added inline previews for CV (PDF viewer) and video introduction in profiles
    • Added admin profile viewing via URL parameter
  • Improvements

    • Enhanced search with debouncing for better performance
    • Implemented optimistic UI updates for privacy toggle
    • Improved profile field display—empty fields no longer render
    • Better file preview/download handling with automatic fallback
    • Refined profile card layout and spacing
  • Bug Fixes

    • Fixed conditional rendering in education and experience sections to hide empty entries

@coderabbitai

coderabbitaiBot commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ae7fc594-e8d6-41f3-928e-d3e63f6cd363

📥 Commits

Reviewing files that changed from the base of the PR and between 9a3a214 and 557e803.

📒 Files selected for processing (23)
  • infrastructure/evault-core/src/core/db/db.service.ts
  • infrastructure/evault-core/src/core/protocol/graphql-server.ts
  • platforms/profile-editor/api/src/controllers/DiscoveryController.ts
  • platforms/profile-editor/api/src/controllers/ProfileController.ts
  • platforms/profile-editor/api/src/controllers/WebhookController.ts
  • platforms/profile-editor/api/src/index.ts
  • platforms/profile-editor/api/src/services/EVaultProfileService.ts
  • platforms/profile-editor/api/src/services/EVaultSyncService.ts
  • platforms/profile-editor/api/src/services/RegistryService.ts
  • platforms/profile-editor/api/src/services/UserSearchService.ts
  • platforms/profile-editor/api/src/utils/file-proxy.ts
  • platforms/profile-editor/api/src/web3adapter/watchers/subscriber.ts
  • platforms/profile-editor/client/src/lib/components/profile/DocumentsSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/EducationSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ExperienceSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ProfileCard.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ProfileHeader.svelte
  • platforms/profile-editor/client/src/lib/stores/discovery.ts
  • platforms/profile-editor/client/src/lib/stores/profile.ts
  • platforms/profile-editor/client/src/lib/utils/file-manager.ts
  • platforms/profile-editor/client/src/routes/(protected)/discover/+page.svelte
  • platforms/profile-editor/client/src/routes/(protected)/profile/+page.svelte
  • platforms/profile-editor/client/src/routes/(protected)/settings/+page.svelte

📝 Walkthrough

Walkthrough

This PR introduces optimistic profile updates with background persistence, deduplicates overlapping envelope metadata, caches profile/registry data with TTL-based invalidation, refactors file proxy handling, enhances the discovery interface with public profile browsing, and adds admin impersonation and conditional asset preview/rendering across API and client.

Changes

Cohort / File(s)Summary
eVault Core Database & GraphQL
infrastructure/evault-core/src/core/db/db.service.ts, infrastructure/evault-core/src/core/protocol/graphql-server.ts
updateMetaEnvelopeById now deduplicates envelopes sharing the same ontology, switches from CREATE to MERGE for relationship construction with ON CREATE/MATCH SET logic, and logs duplicate counts. GraphQL responses for createMetaEnvelope and updateMetaEnvelope now populate parsed field from result envelopes rather than echoing input payload.
Profile API Controllers
platforms/profile-editor/api/src/controllers/DiscoveryController.ts, platforms/profile-editor/api/src/controllers/ProfileController.ts, platforms/profile-editor/api/src/controllers/WebhookController.ts, platforms/profile-editor/api/src/index.ts
Discovery endpoint now conditionally searches or lists public profiles based on query presence; default limit changed to 12. ProfileController adds sync service integration, resolves ename override via query parameter, replaces direct upsert with optimistic updates, refactors asset authorization, and wires sync service during initialization. WebhookController adds diagnostic logging.
Profile API Caching & Persistence Services
platforms/profile-editor/api/src/services/EVaultProfileService.ts, platforms/profile-editor/api/src/services/RegistryService.ts, platforms/profile-editor/api/src/services/UserSearchService.ts
EVaultProfileService introduces per-user caching with TTL, write queueing for serialization, and replaces upsertProfile with prepareUpdate returning a PreparedWrite with immediate cache update and deferred persistence. RegistryService caches resolveEName results (10-min TTL). UserSearchService adds listPublicUsers method for public profile discovery.
Profile API Search Sync & File Proxy
platforms/profile-editor/api/src/services/EVaultSyncService.ts, platforms/profile-editor/api/src/utils/file-proxy.ts, platforms/profile-editor/api/src/web3adapter/watchers/subscriber.ts
EVaultSyncService introduces syncUserToSearchDb to sync cached profiles asynchronously. File proxy replaces mode parameter with disposition, always attempts preview endpoint first, overrides cache headers to no-cache, and derives filenames from upstream headers. Subscriber adds table-change debug logging.
Profile Client Components
platforms/profile-editor/client/src/lib/components/profile/DocumentsSection.svelte, platforms/profile-editor/client/src/lib/components/profile/EducationSection.svelte, platforms/profile-editor/client/src/lib/components/profile/ExperienceSection.svelte, platforms/profile-editor/client/src/lib/components/profile/ProfileCard.svelte, platforms/profile-editor/client/src/lib/components/profile/ProfileHeader.svelte
Components add conditional rendering for empty fields (Education, Experience), preview UI for CV/video assets (Documents), centered avatar/card layout with multi-line headline clamping (ProfileCard), and local object URL previews for avatar/banner uploads with error state handling (ProfileHeader).
Profile Client Stores & Utils
platforms/profile-editor/client/src/lib/stores/discovery.ts, platforms/profile-editor/client/src/lib/stores/profile.ts, platforms/profile-editor/client/src/lib/utils/file-manager.ts, platforms/profile-editor/client/src/routes/(protected)/discover/+page.svelte, platforms/profile-editor/client/src/routes/(protected)/profile/+page.svelte, platforms/profile-editor/client/src/routes/(protected)/settings/+page.svelte
Discovery store conditionally includes q parameter. Profile store adds admin impersonation override accessors and appends query suffix to all profile mutations. File manager removes explicit Content-Type header for multipart uploads. Discover route adds debounced search, initial public profile load, and empty-state UI. Profile route reads as query parameter for admin override. Settings page performs optimistic UI update for public profile toggle with revert on failure.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • feat: idiomatic graphql api #769 — Directly modifies the same db.service.ts meta-envelope update logic and graphql-server.ts response construction that this PR refactors for deduplication and parsed-field population.

Suggested reviewers

  • sosweetham
  • ananyayaya129

Poem

🐰 Caches bloom and queues align,
Envelopes dedupe so fine!
Profiles preview, searched with care,
Async magic floats through air—
One hop closer, crystal clear! ✨

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/profile-editor-performance-improvements

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodos
coodos marked this pull request as ready for review April 3, 2026 09:48
@coodos
coodos merged commit 2416ed1 into mainApr 3, 2026
5 of 6 checks passed
@coodos
coodos deleted the feat/profile-editor-performance-improvements branch April 3, 2026 09:48
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 6, 2026
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Feat/profile editor performance improvements - #942

Merged
coodos merged 16 commits into
mainfrom
feat/profile-editor-performance-improvements
Apr 3, 2026
Merged

Feat/profile editor performance improvements#942
coodos merged 16 commits into
mainfrom
feat/profile-editor-performance-improvements

Conversation

@coodos

@coodoscoodos commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Description of change

improve performance on profile editor

Issue Number

Type of change

  • Update (a change which updates existing functionality)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

Release Notes

  • New Features

    • Added ability to browse public profiles without search queries
    • Added inline previews for CV (PDF viewer) and video introduction in profiles
    • Added admin profile viewing via URL parameter
  • Improvements

    • Enhanced search with debouncing for better performance
    • Implemented optimistic UI updates for privacy toggle
    • Improved profile field display—empty fields no longer render
    • Better file preview/download handling with automatic fallback
    • Refined profile card layout and spacing
  • Bug Fixes

    • Fixed conditional rendering in education and experience sections to hide empty entries

@coderabbitai

coderabbitaiBot commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ae7fc594-e8d6-41f3-928e-d3e63f6cd363

📥 Commits

Reviewing files that changed from the base of the PR and between 9a3a214 and 557e803.

📒 Files selected for processing (23)
  • infrastructure/evault-core/src/core/db/db.service.ts
  • infrastructure/evault-core/src/core/protocol/graphql-server.ts
  • platforms/profile-editor/api/src/controllers/DiscoveryController.ts
  • platforms/profile-editor/api/src/controllers/ProfileController.ts
  • platforms/profile-editor/api/src/controllers/WebhookController.ts
  • platforms/profile-editor/api/src/index.ts
  • platforms/profile-editor/api/src/services/EVaultProfileService.ts
  • platforms/profile-editor/api/src/services/EVaultSyncService.ts
  • platforms/profile-editor/api/src/services/RegistryService.ts
  • platforms/profile-editor/api/src/services/UserSearchService.ts
  • platforms/profile-editor/api/src/utils/file-proxy.ts
  • platforms/profile-editor/api/src/web3adapter/watchers/subscriber.ts
  • platforms/profile-editor/client/src/lib/components/profile/DocumentsSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/EducationSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ExperienceSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ProfileCard.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ProfileHeader.svelte
  • platforms/profile-editor/client/src/lib/stores/discovery.ts
  • platforms/profile-editor/client/src/lib/stores/profile.ts
  • platforms/profile-editor/client/src/lib/utils/file-manager.ts
  • platforms/profile-editor/client/src/routes/(protected)/discover/+page.svelte
  • platforms/profile-editor/client/src/routes/(protected)/profile/+page.svelte
  • platforms/profile-editor/client/src/routes/(protected)/settings/+page.svelte

📝 Walkthrough

Walkthrough

This PR introduces optimistic profile updates with background persistence, deduplicates overlapping envelope metadata, caches profile/registry data with TTL-based invalidation, refactors file proxy handling, enhances the discovery interface with public profile browsing, and adds admin impersonation and conditional asset preview/rendering across API and client.

Changes

Cohort / File(s)Summary
eVault Core Database & GraphQL
infrastructure/evault-core/src/core/db/db.service.ts, infrastructure/evault-core/src/core/protocol/graphql-server.ts
updateMetaEnvelopeById now deduplicates envelopes sharing the same ontology, switches from CREATE to MERGE for relationship construction with ON CREATE/MATCH SET logic, and logs duplicate counts. GraphQL responses for createMetaEnvelope and updateMetaEnvelope now populate parsed field from result envelopes rather than echoing input payload.
Profile API Controllers
platforms/profile-editor/api/src/controllers/DiscoveryController.ts, platforms/profile-editor/api/src/controllers/ProfileController.ts, platforms/profile-editor/api/src/controllers/WebhookController.ts, platforms/profile-editor/api/src/index.ts
Discovery endpoint now conditionally searches or lists public profiles based on query presence; default limit changed to 12. ProfileController adds sync service integration, resolves ename override via query parameter, replaces direct upsert with optimistic updates, refactors asset authorization, and wires sync service during initialization. WebhookController adds diagnostic logging.
Profile API Caching & Persistence Services
platforms/profile-editor/api/src/services/EVaultProfileService.ts, platforms/profile-editor/api/src/services/RegistryService.ts, platforms/profile-editor/api/src/services/UserSearchService.ts
EVaultProfileService introduces per-user caching with TTL, write queueing for serialization, and replaces upsertProfile with prepareUpdate returning a PreparedWrite with immediate cache update and deferred persistence. RegistryService caches resolveEName results (10-min TTL). UserSearchService adds listPublicUsers method for public profile discovery.
Profile API Search Sync & File Proxy
platforms/profile-editor/api/src/services/EVaultSyncService.ts, platforms/profile-editor/api/src/utils/file-proxy.ts, platforms/profile-editor/api/src/web3adapter/watchers/subscriber.ts
EVaultSyncService introduces syncUserToSearchDb to sync cached profiles asynchronously. File proxy replaces mode parameter with disposition, always attempts preview endpoint first, overrides cache headers to no-cache, and derives filenames from upstream headers. Subscriber adds table-change debug logging.
Profile Client Components
platforms/profile-editor/client/src/lib/components/profile/DocumentsSection.svelte, platforms/profile-editor/client/src/lib/components/profile/EducationSection.svelte, platforms/profile-editor/client/src/lib/components/profile/ExperienceSection.svelte, platforms/profile-editor/client/src/lib/components/profile/ProfileCard.svelte, platforms/profile-editor/client/src/lib/components/profile/ProfileHeader.svelte
Components add conditional rendering for empty fields (Education, Experience), preview UI for CV/video assets (Documents), centered avatar/card layout with multi-line headline clamping (ProfileCard), and local object URL previews for avatar/banner uploads with error state handling (ProfileHeader).
Profile Client Stores & Utils
platforms/profile-editor/client/src/lib/stores/discovery.ts, platforms/profile-editor/client/src/lib/stores/profile.ts, platforms/profile-editor/client/src/lib/utils/file-manager.ts, platforms/profile-editor/client/src/routes/(protected)/discover/+page.svelte, platforms/profile-editor/client/src/routes/(protected)/profile/+page.svelte, platforms/profile-editor/client/src/routes/(protected)/settings/+page.svelte
Discovery store conditionally includes q parameter. Profile store adds admin impersonation override accessors and appends query suffix to all profile mutations. File manager removes explicit Content-Type header for multipart uploads. Discover route adds debounced search, initial public profile load, and empty-state UI. Profile route reads as query parameter for admin override. Settings page performs optimistic UI update for public profile toggle with revert on failure.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • feat: idiomatic graphql api #769 — Directly modifies the same db.service.ts meta-envelope update logic and graphql-server.ts response construction that this PR refactors for deduplication and parsed-field population.

Suggested reviewers

  • sosweetham
  • ananyayaya129

Poem

🐰 Caches bloom and queues align,
Envelopes dedupe so fine!
Profiles preview, searched with care,
Async magic floats through air—
One hop closer, crystal clear! ✨

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/profile-editor-performance-improvements

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodos
coodos marked this pull request as ready for review April 3, 2026 09:48
@coodos
coodos merged commit 2416ed1 into mainApr 3, 2026
5 of 6 checks passed
@coodos
coodos deleted the feat/profile-editor-performance-improvements branch April 3, 2026 09:48
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 6, 2026
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@coodos
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Feat/profile editor performance improvements - #942

Merged
coodos merged 16 commits into
mainfrom
feat/profile-editor-performance-improvements
Apr 3, 2026
Merged

Feat/profile editor performance improvements#942
coodos merged 16 commits into
mainfrom
feat/profile-editor-performance-improvements

Conversation

@coodos

@coodoscoodos commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Description of change

improve performance on profile editor

Issue Number

Type of change

  • Update (a change which updates existing functionality)

How the change has been tested

Change checklist

  • I have ensured that the CI Checks pass locally
  • I have removed any unnecessary logic
  • My code is well documented
  • I have signed my commits
  • My code follows the pattern of the application
  • I have self reviewed my code

Summary by CodeRabbit

Release Notes

  • New Features

    • Added ability to browse public profiles without search queries
    • Added inline previews for CV (PDF viewer) and video introduction in profiles
    • Added admin profile viewing via URL parameter
  • Improvements

    • Enhanced search with debouncing for better performance
    • Implemented optimistic UI updates for privacy toggle
    • Improved profile field display—empty fields no longer render
    • Better file preview/download handling with automatic fallback
    • Refined profile card layout and spacing
  • Bug Fixes

    • Fixed conditional rendering in education and experience sections to hide empty entries

@coderabbitai

coderabbitaiBot commented Apr 3, 2026

Copy link
Copy Markdown
Contributor

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ae7fc594-e8d6-41f3-928e-d3e63f6cd363

📥 Commits

Reviewing files that changed from the base of the PR and between 9a3a214 and 557e803.

📒 Files selected for processing (23)
  • infrastructure/evault-core/src/core/db/db.service.ts
  • infrastructure/evault-core/src/core/protocol/graphql-server.ts
  • platforms/profile-editor/api/src/controllers/DiscoveryController.ts
  • platforms/profile-editor/api/src/controllers/ProfileController.ts
  • platforms/profile-editor/api/src/controllers/WebhookController.ts
  • platforms/profile-editor/api/src/index.ts
  • platforms/profile-editor/api/src/services/EVaultProfileService.ts
  • platforms/profile-editor/api/src/services/EVaultSyncService.ts
  • platforms/profile-editor/api/src/services/RegistryService.ts
  • platforms/profile-editor/api/src/services/UserSearchService.ts
  • platforms/profile-editor/api/src/utils/file-proxy.ts
  • platforms/profile-editor/api/src/web3adapter/watchers/subscriber.ts
  • platforms/profile-editor/client/src/lib/components/profile/DocumentsSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/EducationSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ExperienceSection.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ProfileCard.svelte
  • platforms/profile-editor/client/src/lib/components/profile/ProfileHeader.svelte
  • platforms/profile-editor/client/src/lib/stores/discovery.ts
  • platforms/profile-editor/client/src/lib/stores/profile.ts
  • platforms/profile-editor/client/src/lib/utils/file-manager.ts
  • platforms/profile-editor/client/src/routes/(protected)/discover/+page.svelte
  • platforms/profile-editor/client/src/routes/(protected)/profile/+page.svelte
  • platforms/profile-editor/client/src/routes/(protected)/settings/+page.svelte

📝 Walkthrough

Walkthrough

This PR introduces optimistic profile updates with background persistence, deduplicates overlapping envelope metadata, caches profile/registry data with TTL-based invalidation, refactors file proxy handling, enhances the discovery interface with public profile browsing, and adds admin impersonation and conditional asset preview/rendering across API and client.

Changes

Cohort / File(s)Summary
eVault Core Database & GraphQL
infrastructure/evault-core/src/core/db/db.service.ts, infrastructure/evault-core/src/core/protocol/graphql-server.ts
updateMetaEnvelopeById now deduplicates envelopes sharing the same ontology, switches from CREATE to MERGE for relationship construction with ON CREATE/MATCH SET logic, and logs duplicate counts. GraphQL responses for createMetaEnvelope and updateMetaEnvelope now populate parsed field from result envelopes rather than echoing input payload.
Profile API Controllers
platforms/profile-editor/api/src/controllers/DiscoveryController.ts, platforms/profile-editor/api/src/controllers/ProfileController.ts, platforms/profile-editor/api/src/controllers/WebhookController.ts, platforms/profile-editor/api/src/index.ts
Discovery endpoint now conditionally searches or lists public profiles based on query presence; default limit changed to 12. ProfileController adds sync service integration, resolves ename override via query parameter, replaces direct upsert with optimistic updates, refactors asset authorization, and wires sync service during initialization. WebhookController adds diagnostic logging.
Profile API Caching & Persistence Services
platforms/profile-editor/api/src/services/EVaultProfileService.ts, platforms/profile-editor/api/src/services/RegistryService.ts, platforms/profile-editor/api/src/services/UserSearchService.ts
EVaultProfileService introduces per-user caching with TTL, write queueing for serialization, and replaces upsertProfile with prepareUpdate returning a PreparedWrite with immediate cache update and deferred persistence. RegistryService caches resolveEName results (10-min TTL). UserSearchService adds listPublicUsers method for public profile discovery.
Profile API Search Sync & File Proxy
platforms/profile-editor/api/src/services/EVaultSyncService.ts, platforms/profile-editor/api/src/utils/file-proxy.ts, platforms/profile-editor/api/src/web3adapter/watchers/subscriber.ts
EVaultSyncService introduces syncUserToSearchDb to sync cached profiles asynchronously. File proxy replaces mode parameter with disposition, always attempts preview endpoint first, overrides cache headers to no-cache, and derives filenames from upstream headers. Subscriber adds table-change debug logging.
Profile Client Components
platforms/profile-editor/client/src/lib/components/profile/DocumentsSection.svelte, platforms/profile-editor/client/src/lib/components/profile/EducationSection.svelte, platforms/profile-editor/client/src/lib/components/profile/ExperienceSection.svelte, platforms/profile-editor/client/src/lib/components/profile/ProfileCard.svelte, platforms/profile-editor/client/src/lib/components/profile/ProfileHeader.svelte
Components add conditional rendering for empty fields (Education, Experience), preview UI for CV/video assets (Documents), centered avatar/card layout with multi-line headline clamping (ProfileCard), and local object URL previews for avatar/banner uploads with error state handling (ProfileHeader).
Profile Client Stores & Utils
platforms/profile-editor/client/src/lib/stores/discovery.ts, platforms/profile-editor/client/src/lib/stores/profile.ts, platforms/profile-editor/client/src/lib/utils/file-manager.ts, platforms/profile-editor/client/src/routes/(protected)/discover/+page.svelte, platforms/profile-editor/client/src/routes/(protected)/profile/+page.svelte, platforms/profile-editor/client/src/routes/(protected)/settings/+page.svelte
Discovery store conditionally includes q parameter. Profile store adds admin impersonation override accessors and appends query suffix to all profile mutations. File manager removes explicit Content-Type header for multipart uploads. Discover route adds debounced search, initial public profile load, and empty-state UI. Profile route reads as query parameter for admin override. Settings page performs optimistic UI update for public profile toggle with revert on failure.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • feat: idiomatic graphql api #769 — Directly modifies the same db.service.ts meta-envelope update logic and graphql-server.ts response construction that this PR refactors for deduplication and parsed-field population.

Suggested reviewers

  • sosweetham
  • ananyayaya129

Poem

🐰 Caches bloom and queues align,
Envelopes dedupe so fine!
Profiles preview, searched with care,
Async magic floats through air—
One hop closer, crystal clear! ✨

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/profile-editor-performance-improvements

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coodos
coodos marked this pull request as ready for review April 3, 2026 09:48
@coodos
coodos merged commit 2416ed1 into mainApr 3, 2026
5 of 6 checks passed
@coodos
coodos deleted the feat/profile-editor-performance-improvements branch April 3, 2026 09:48
@coderabbitaicoderabbitaiBot mentioned this pull request Apr 6, 2026
6 tasks
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@coodos