Allow deleting user account with active memberships#11787
Allow deleting user account with active memberships#11787lohanidamodar merged 10 commits into1.9.xfrom
Conversation
Instead of blocking account deletion when the user has confirmed team memberships, handle memberships gracefully during deletion: - Sole owner + sole member: delete the team and queue project cleanup - Sole owner + other members: transfer ownership to the next member - Non-owner / multiple owners: no special handling needed (worker cleans up) Also update the Deletes worker to transfer the team's primary user reference when removing a deleted user's memberships. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Greptile SummaryThis PR removes the blanket The main concern is that the replacement Confidence Score: 4/5Safe to merge after cleaning up the dead loop and unused injection in account.php. All remaining findings are P2. The dead loop is harmless correctness-wise but wastes a DB round-trip per confirmed membership on the deletion path and will confuse future readers — worth fixing before merge. The app/controllers/api/account.php — dead loop and unused $authorization injection should be removed. Important Files Changed
Reviews (9): Last reviewed commit: "Merge remote-tracking branch 'origin/1.9..." | Re-trigger Greptile |
🔄 PHP-Retry SummaryFlaky tests detected across commits: Commit
|
| Test | Retries | Total Time | Details |
|---|---|---|---|
LegacyTransactionsConsoleClientTest::testBulkUpdateWithTransactionAwareQueries |
1 | 240.38s | Logs |
UsageTest::testVectorsDBStats |
1 | 10.03s | Logs |
Commit 8442a1e - 2 flaky tests
| Test | Retries | Total Time | Details |
|---|---|---|---|
UsageTest::testVectorsDBStats |
1 | 10.12s | Logs |
LegacyCustomServerTest::testCreateIndexes |
1 | 242.11s | Logs |
Commit d6f51a9 - 6 flaky tests
| Test | Retries | Total Time | Details |
|---|---|---|---|
UsageTest::testFunctionsStats |
1 | 10.26s | Logs |
UsageTest::testPrepareSitesStats |
1 | 9ms | Logs |
UsageTest::testEmbeddingsTextUsageDoesNotBreakProjectUsage |
1 | 9ms | Logs |
LegacyConsoleClientTest::testUpsertDocument |
1 | 241.87s | Logs |
LegacyConsoleClientTest::testOneToManyRelationship |
1 | 240.83s | Logs |
LegacyCustomClientTest::testCreatedAfter |
1 | 240.37s | Logs |
Commit c6e3294 - 5 flaky tests
| Test | Retries | Total Time | Details |
|---|---|---|---|
UsageTest::testFunctionsStats |
1 | 10.26s | Logs |
UsageTest::testPrepareSitesStats |
1 | 7ms | Logs |
UsageTest::testEmbeddingsTextUsageDoesNotBreakProjectUsage |
1 | 5ms | Logs |
TablesDBConsoleClientTest::testInvalidDocumentStructure |
1 | 240.57s | Logs |
TablesDBCustomServerTest::testTimeout |
1 | 240.22s | Logs |
Commit f78b5c6 - 6 flaky tests
| Test | Retries | Total Time | Details |
|---|---|---|---|
LegacyCustomServerTest::testCreateIndexes |
1 | 243.00s | Logs |
VectorsDBConsoleClientTest::testGetCollectionLogs |
1 | 7ms | Logs |
DatabasesConsoleClientTest::testGetCollectionLogs |
1 | 9ms | Logs |
UsageTest::testFunctionsStats |
1 | 10.19s | Logs |
UsageTest::testPrepareSitesStats |
1 | 7ms | Logs |
UsageTest::testEmbeddingsTextUsageDoesNotBreakProjectUsage |
1 | 5ms | Logs |
Note: Flaky test results are tracked for the last 5 commits
✨ Benchmark results
⚡ Benchmark Comparison
|
Prevent unconfirmed (pending invite) members from being promoted to
owner or set as the team's primary user during membership/account
deletion by adding a Query::equal('confirm', [true]) filter to the
relevant findOne queries.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…g, deduplicate transfer - Remove team deletion for sole owner+sole member case; let orphan teams be cleaned up by Cloud's inactive project cleanup (safer, avoids accidental data loss) - Add explicit ordering by $createdAt so the most veteran member gets ownership transfer, with limit(1) for clarity - Remove confirm filter on primary user transfer in membership deletion so all members (including unconfirmed) are considered - Remove redundant ownership transfer from Deletes worker since the API controller already handles it before queueing Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… and primary user transfer Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…d instead Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Summary
DELETE /v1/account) when the user had team memberships on the console projectorderAsc('$createdAt'))Changes
app/controllers/api/account.php— Replaced blanket deletion block with graceful ownership transfer for sole ownerssrc/Appwrite/Platform/Workers/Deletes.php— Cleaned up unused closure variablesrc/Appwrite/Platform/Modules/Teams/Http/Memberships/Delete.php— Removed confirm filter on primary user transfer (all members eligible)tests/e2e/Services/Account/AccountConsoleClientTest.php— Added tests for deletion with/without membershipsTest plan
docker compose exec appwrite test tests/e2e/Services/Account/AccountConsoleClientTest.php🤖 Generated with Claude Code