public async Task <ImageUploadResultDto> UploadImageAsync(int id, IFormFile file)
        {
            var contact = await GetById(id);

            var currentPublicId = contact.PublicId;

            var account = new Account();

            _configuration.Bind("CloudinaryAccount", account);

            var cloudinary = new Cloudinary(account);

            if (file.Length <= 0)
            {
                throw new RestException(HttpStatusCode.BadRequest, "Invalid file.");
            }

            await using var stream = file.OpenReadStream();

            var param = new ImageUploadParams
            {
                File           = new FileDescription(file.FileName, stream),
                Transformation = new Transformation().Height(500).Width(500).Gravity("face").Crop("fill")
            };

            var result = await cloudinary.UploadAsync(param);

            if (result == null || result.Error != null)
            {
                var message = result == null ? "Error while uploading the image." : result.Error.Message;
                throw new RestException(HttpStatusCode.BadRequest, message);
            }

            contact.ImageUrl = result.SecureUrl.AbsoluteUri;
            contact.PublicId = result.PublicId;

            await Context.SaveChangesAsync();

            await _messageHub.SendImageUploadMessageAsync(new ImageUploadEventMessageDto
            {
                ContactId = id
            });

            if (currentPublicId != null)
            {
                var deleteParam = new DeletionParams(currentPublicId);
                await cloudinary.DestroyAsync(deleteParam);
            }

            return(new ImageUploadResultDto
            {
                PublicId = contact.PublicId,
                ImageUrl = contact.ImageUrl
            });
        }