Sync phone contacts and enable chat deletion

This commit is contained in:
Курнат Андрей
2026-07-13 21:10:10 +03:00
parent ff3f139889
commit 582f99ed0e
17 changed files with 636 additions and 49 deletions
@@ -21,8 +21,62 @@ public sealed class ContactsController(IMaxBridgeClient maxBridge) : ControllerB
contact.DisplayName,
contact.AvatarUrl,
contact.PhoneNumber,
contact.Status))
contact.Status,
contact.IsSavedContact))
.OrderBy(contact => contact.DisplayName, StringComparer.CurrentCultureIgnoreCase)
.ToArray();
}
[HttpPost("import")]
public async Task<ActionResult<IReadOnlyList<ContactDto>>> ImportContacts(
ImportPhoneContactsRequest request,
CancellationToken cancellationToken)
{
var contacts = request.Contacts
.Where(contact => !string.IsNullOrWhiteSpace(contact.PhoneNumber))
.Take(5000)
.Select(contact => new MaxPhoneContact(
contact.PhoneNumber.Trim(),
string.IsNullOrWhiteSpace(contact.FirstName) ? contact.PhoneNumber.Trim() : contact.FirstName.Trim(),
contact.LastName?.Trim()))
.ToArray();
if (contacts.Length == 0)
{
return BadRequest("contacts with phone numbers are required.");
}
var imported = await maxBridge.ImportContactsAsync(contacts, cancellationToken);
return imported.Select(ToDto).ToArray();
}
[HttpPost("add")]
public async Task<ActionResult<ContactDto>> AddContact(ContactUserRequest request, CancellationToken cancellationToken)
{
if (string.IsNullOrWhiteSpace(request.UserId))
{
return BadRequest("userId is required.");
}
var contact = await maxBridge.AddContactAsync(request.UserId.Trim(), cancellationToken);
return contact is null ? BadRequest("MAX did not add the contact.") : ToDto(contact);
}
[HttpPost("remove")]
public async Task<IActionResult> RemoveContact(ContactUserRequest request, CancellationToken cancellationToken)
{
if (string.IsNullOrWhiteSpace(request.UserId))
{
return BadRequest("userId is required.");
}
var result = await maxBridge.RemoveContactAsync(request.UserId.Trim(), cancellationToken);
return result.Success ? NoContent() : BadRequest(result.Error ?? "MAX did not remove the contact.");
}
private static ContactDto ToDto(MaxContact contact) => new(
contact.UserId,
contact.ExternalChatId,
contact.DisplayName,
contact.AvatarUrl,
contact.PhoneNumber,
contact.Status,
contact.IsSavedContact);
}