Ejemplo n.º 1
0
        public async Task <string> HandleWebhook([FromBody] JObject data)
        {
            logger.LogInformation(data.ToString(Formatting.None));
            VenmoWebhookRequest request = data.ToObject <VenmoWebhookRequest>() !;
            string message = string.Empty;

            if (request.Type == "payment.created")
            {
                var databaseInfo = GetUserFromDatabases(request.Data.Target.User.Id);
                if (databaseInfo == null)
                {
                    return("");
                }

                if (WebhookSeenBefore(databaseInfo.Value.user, request.Data.Id, request.Data.Status))
                {
                    return("");
                }

                SaveWebhookId(databaseInfo.Value.user, request.Data.Id, request.Data.Status, databaseInfo.Value.database);
                SlackCore slackApi = new SlackCore(databaseInfo.Value.workspaceInfo.BotToken);
                message += $"{request.Data.Actor.DisplayName} ({request.Data.Actor.Username}) ";

                if (request.Data.Action == "pay")
                {
                    message += "paid you ";
                }
                else if (request.Data.Action == "charge")
                {
                    message += "charged you ";
                }
                message += $"${request.Data.Amount:F2} for {request.Data.Note}";

                if (request.Data.Action == "pay")
                {
                    await SendSlackMessage(databaseInfo.Value.workspaceInfo, message, databaseInfo.Value.user.UserId, httpClient);
                }

                if (request.Data.Action == "charge")
                {
                    message += $" | ID: {request.Data.Id}";
                    string        acceptCommand = $"venmo complete accept {request.Data.Id}";
                    List <IBlock> blocks        = new List <IBlock>();
                    blocks.Add(new Section(TextObject.CreatePlainTextObject($"{message}\n/{acceptCommand}"), null, null,
                                           new golf1052.SlackAPI.BlockKit.BlockElements.Image(request.Data.Actor.ProfilePictureUrl,
                                                                                              $"Venmo profile picture of {request.Data.Actor.DisplayName}")));
                    blocks.Add(new Actions(
                                   new Button("Accept", "acceptButton", null, acceptCommand, null, null),
                                   new Button("Reject", "rejectButton", null, $"venmo complete reject {request.Data.Id}", null, null)));

                    var channels = await slackApi.ConversationsList(false, "im");

                    var userChannel = channels.FirstOrDefault(c => c.User == databaseInfo.Value.user.UserId);
                    if (userChannel != null)
                    {
                        await SendSlackMessage(databaseInfo.Value.workspaceInfo, $"{message}\n/{acceptCommand}", blocks, userChannel.Id, httpClient);
                    }
                }
            }
            else if (request.Type == "payment.updated")
            {
                if (request.Data.Target.Type != "user")
                {
                    return("");
                }

                // When user charges someone else and their payment is completed the user is the actor.
                // When user is charged by someone else and their payment is completed the user is the target.
                var databaseInfo = GetUserFromDatabases(request.Data.Actor.Id);
                if (databaseInfo == null)
                {
                    return("");
                }

                if (WebhookSeenBefore(databaseInfo.Value.user, request.Data.Id, request.Data.Status))
                {
                    return("");
                }
                SaveWebhookId(databaseInfo.Value.user, request.Data.Id, request.Data.Status, databaseInfo.Value.database);
                message += $"{request.Data.Target.User.DisplayName} ({request.Data.Target.User.Username}) ";

                if (request.Data.Status == "settled")
                {
                    message += "accepted your ";
                }
                else if (request.Data.Status == "cancelled")
                {
                    message += "rejected your ";
                }
                message += $"${request.Data.Amount:F2} charge for {request.Data.Note}";
                await SendSlackMessage(databaseInfo.Value.workspaceInfo, message, databaseInfo.Value.user.UserId, httpClient);
            }
            return("");
        }