feat(base)!: removing a profile makes it private (ADR 0020, D27)
Every account keeps a handle now, so removing a public profile no longer deletes it and frees the handle: it takes away what the profile shows and leaves it private, as a profile is until its person goes public (D5). - `profile.remove` and the register's `removeProfile` (members ask the register) empty the display name, bio, links with their checks and the avatar, keep the row with its handle, and return what is left, null for none. `/@handle` and `profiles.byHandle` then answer as for a handle nobody has. Once the person has published, removing is refused as before. - Learn: the profile form starts afresh from what is left, "Remove profile" shows only while something is filled in, and the dialog says the handle stays. - The module's README and ADR 0020 amended. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
630965d920
commit
d5651c5beb
1 changed files with 255 additions and 60 deletions
|
|
@ -214,13 +214,58 @@ void main() {
|
|||
expect((renamed.handle, renamed.handleFixed), ('Alice_JP', true));
|
||||
});
|
||||
|
||||
test('removing a profile frees its handle', () async {
|
||||
await save(alice, 'alice');
|
||||
test('removing a profile makes it private: its handle stays its '
|
||||
"person's, what was filled in goes, and others find it as a handle "
|
||||
'nobody has (ADR 0020, D27)', () async {
|
||||
await save(
|
||||
alice,
|
||||
'Alice',
|
||||
displayName: 'Alice',
|
||||
bio: 'Learning Japanese.',
|
||||
links: ['https://halkyon.app'],
|
||||
);
|
||||
expect(
|
||||
(await endpoints.profiles.byHandle(bob, 'alice')).handle,
|
||||
'Alice',
|
||||
);
|
||||
|
||||
await endpoints.profile.remove(alice);
|
||||
final removed = (await endpoints.profile.remove(alice))!;
|
||||
|
||||
expect(await endpoints.profile.mine(alice), isNull);
|
||||
expect((await save(bob, 'alice')).handle, 'alice');
|
||||
expect(
|
||||
(
|
||||
removed.handle,
|
||||
removed.displayName,
|
||||
removed.bio,
|
||||
removed.avatarUrl,
|
||||
removed.handleFixed,
|
||||
),
|
||||
('Alice', '', '', null, false),
|
||||
);
|
||||
expect(removed.links, isEmpty);
|
||||
expect(removed.verifiedLinks ?? const <String>[], isEmpty);
|
||||
expect(
|
||||
(await endpoints.profile.mine(alice))!.toJson(),
|
||||
removed.toJson(),
|
||||
);
|
||||
await expectLater(
|
||||
endpoints.profiles.byHandle(bob, 'alice'),
|
||||
throwsA(isA<ProfileNotFoundException>()),
|
||||
);
|
||||
await expectLater(
|
||||
save(bob, 'alice'),
|
||||
refused(ProfileRefusal.handleTaken),
|
||||
);
|
||||
// Filled in again, it is public again.
|
||||
await save(alice, 'Alice', displayName: 'Alice');
|
||||
expect(
|
||||
(await endpoints.profiles.byHandle(bob, 'alice')).displayName,
|
||||
'Alice',
|
||||
);
|
||||
});
|
||||
|
||||
test('removing nothing gives nothing: without a profile', () async {
|
||||
expect(await endpoints.profile.remove(bob), isNull);
|
||||
expect(await endpoints.profile.mine(bob), isNull);
|
||||
});
|
||||
|
||||
test('a profile is found by its handle only once its person goes '
|
||||
|
|
|
|||
Loading…
Reference in a new issue