mirror of
https://github.com/D4M13N-D3V/comissions-app-core-api.git
synced 2025-06-16 05:09:09 +00:00
feat: added notifications
This commit is contained in:
parent
04861b6b58
commit
76623668ad
@ -10,6 +10,8 @@ using Microsoft.AspNetCore.Authorization;
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using Novu;
|
||||||
|
using Novu.DTO.Events;
|
||||||
|
|
||||||
namespace comissions.app.api.Controllers;
|
namespace comissions.app.api.Controllers;
|
||||||
|
|
||||||
@ -20,10 +22,11 @@ public class ArtistController : Controller
|
|||||||
private readonly ApplicationDbContext _dbContext;
|
private readonly ApplicationDbContext _dbContext;
|
||||||
private readonly IStorageService _storageService;
|
private readonly IStorageService _storageService;
|
||||||
private readonly IPaymentService _paymentService;
|
private readonly IPaymentService _paymentService;
|
||||||
|
private readonly NovuClient _client;
|
||||||
|
|
||||||
|
public ArtistController(ApplicationDbContext dbContext, IPaymentService paymentService, IStorageService storageService, NovuClient client)
|
||||||
public ArtistController(ApplicationDbContext dbContext, IPaymentService paymentService, IStorageService storageService)
|
|
||||||
{
|
{
|
||||||
|
_client = client;
|
||||||
_paymentService = paymentService;
|
_paymentService = paymentService;
|
||||||
_storageService = storageService;
|
_storageService = storageService;
|
||||||
_dbContext = dbContext;
|
_dbContext = dbContext;
|
||||||
@ -67,6 +70,16 @@ public class ArtistController : Controller
|
|||||||
updatedArtist = _dbContext.UserArtists.Update(updatedArtist).Entity;
|
updatedArtist = _dbContext.UserArtists.Update(updatedArtist).Entity;
|
||||||
await _dbContext.SaveChangesAsync();
|
await _dbContext.SaveChangesAsync();
|
||||||
var result = updatedArtist.ToModel();
|
var result = updatedArtist.ToModel();
|
||||||
|
|
||||||
|
_client.Event.Trigger(new EventCreateData()
|
||||||
|
{
|
||||||
|
EventName = "ArtistUpdated",
|
||||||
|
To =
|
||||||
|
{
|
||||||
|
SubscriberId = userId,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,10 +3,13 @@ using comissions.app.api.Services.Payment;
|
|||||||
using comissions.app.api.Services.Storage;
|
using comissions.app.api.Services.Storage;
|
||||||
using comissions.app.database;
|
using comissions.app.database;
|
||||||
using comissions.app.database.Entities;
|
using comissions.app.database.Entities;
|
||||||
|
using comissions.app.database.Enums;
|
||||||
using comissions.app.database.Models.Request;
|
using comissions.app.database.Models.Request;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Stripe;
|
||||||
|
using Stripe.Checkout;
|
||||||
|
|
||||||
namespace comissions.app.api.Controllers;
|
namespace comissions.app.api.Controllers;
|
||||||
|
|
||||||
@ -18,14 +21,643 @@ public class RequestsController : Controller
|
|||||||
private readonly IStorageService _storageService;
|
private readonly IStorageService _storageService;
|
||||||
private readonly IPaymentService _paymentService;
|
private readonly IPaymentService _paymentService;
|
||||||
|
|
||||||
|
private readonly string _webHookSecret;
|
||||||
|
|
||||||
public RequestsController(ApplicationDbContext dbContext, IPaymentService paymentService, IStorageService storageService)
|
public RequestsController(ApplicationDbContext dbContext, IPaymentService paymentService, IStorageService storageService, IConfiguration configuration)
|
||||||
{
|
{
|
||||||
|
_webHookSecret = configuration.GetValue<string>("Stripe:WebHookSecret");
|
||||||
_paymentService = paymentService;
|
_paymentService = paymentService;
|
||||||
_storageService = storageService;
|
_storageService = storageService;
|
||||||
_dbContext = dbContext;
|
_dbContext = dbContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Route("PaymentWebhook")]
|
||||||
|
[HttpPost("PaymentWebhook")]
|
||||||
|
[AllowAnonymous]
|
||||||
|
public async Task<IActionResult> ProcessWebhookEvent()
|
||||||
|
{
|
||||||
|
var json = await new StreamReader(HttpContext.Request.Body).ReadToEndAsync();
|
||||||
|
|
||||||
|
// If you are testing your webhook locally with the Stripe CLI you
|
||||||
|
// can find the endpoint's secret by running `stripe listen`
|
||||||
|
// Otherwise, find your endpoint's secret in your webhook settings
|
||||||
|
// in the Developer Dashboard
|
||||||
|
var stripeEvent = EventUtility.ConstructEvent(json, Request.Headers["Stripe-Signature"], _webHookSecret);
|
||||||
|
|
||||||
|
if (stripeEvent.Type == Events.CheckoutSessionExpired)
|
||||||
|
{
|
||||||
|
var session = stripeEvent.Data.Object as Session;
|
||||||
|
var connectedAccountId = stripeEvent.Account;
|
||||||
|
var requestId = session.LineItems.First().Price.Product.Name;
|
||||||
|
var request = await _dbContext.Requests
|
||||||
|
.Include(x=>x.Artist)
|
||||||
|
.Include(x=>x.User)
|
||||||
|
.FirstOrDefaultAsync(x=>x.Id==int.Parse(requestId));
|
||||||
|
if (request != null && request.Accepted && !request.Declined && !request.Completed &&
|
||||||
|
request.Artist.StripeAccountId == connectedAccountId)
|
||||||
|
{
|
||||||
|
request.PaymentUrl = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CheckoutSessionCompleted)
|
||||||
|
{
|
||||||
|
var session = stripeEvent.Data.Object as Session;
|
||||||
|
var connectedAccountId = stripeEvent.Account;
|
||||||
|
var requestId = session.Metadata["/OrderId"];
|
||||||
|
var request = await _dbContext.Requests
|
||||||
|
.Include(x=>x.Artist)
|
||||||
|
.FirstOrDefaultAsync(x=>x.Id==int.Parse(requestId));
|
||||||
|
if (request != null && request.Accepted && !request.Declined && !request.Completed &&
|
||||||
|
request.Artist.StripeAccountId == connectedAccountId)
|
||||||
|
{
|
||||||
|
request.Paid = true;
|
||||||
|
request.PaidDate = DateTime.UtcNow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.AccountUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.AccountApplicationAuthorized)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.AccountApplicationDeauthorized)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.AccountExternalAccountCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.AccountExternalAccountDeleted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.AccountExternalAccountUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ApplicationFeeCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ApplicationFeeRefunded)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ApplicationFeeRefundUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.BalanceAvailable)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.BillingPortalConfigurationCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.BillingPortalConfigurationUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.BillingPortalSessionCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CapabilityUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CashBalanceFundsAvailable)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ChargeCaptured)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ChargeExpired)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ChargeFailed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ChargePending)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ChargeRefunded)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ChargeSucceeded)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ChargeUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ChargeDisputeClosed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ChargeDisputeCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ChargeDisputeFundsReinstated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ChargeDisputeFundsWithdrawn)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ChargeDisputeUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ChargeRefundUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CheckoutSessionAsyncPaymentFailed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CheckoutSessionAsyncPaymentSucceeded)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CheckoutSessionCompleted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CheckoutSessionExpired)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ClimateOrderCanceled)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ClimateOrderCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ClimateOrderDelayed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ClimateOrderDelivered)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ClimateOrderProductSubstituted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ClimateProductCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ClimateProductPricingUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CouponCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CouponDeleted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CouponUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CreditNoteCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CreditNoteUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CreditNoteVoided)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerDeleted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerDiscountCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerDiscountDeleted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerDiscountUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerSourceCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerSourceDeleted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerSourceExpiring)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerSourceUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerSubscriptionCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerSubscriptionDeleted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerSubscriptionPaused)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerSubscriptionPendingUpdateApplied)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerSubscriptionPendingUpdateExpired)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerSubscriptionResumed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerSubscriptionTrialWillEnd)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerSubscriptionUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerTaxIdCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerTaxIdDeleted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerTaxIdUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.CustomerCashBalanceTransactionCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.FileCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.FinancialConnectionsAccountCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.FinancialConnectionsAccountDeactivated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.FinancialConnectionsAccountDisconnected)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.FinancialConnectionsAccountReactivated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.FinancialConnectionsAccountRefreshedBalance)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.FinancialConnectionsAccountRefreshedTransactions)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IdentityVerificationSessionCanceled)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IdentityVerificationSessionCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IdentityVerificationSessionProcessing)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IdentityVerificationSessionRequiresInput)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IdentityVerificationSessionVerified)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.InvoiceCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.InvoiceDeleted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.InvoiceFinalizationFailed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.InvoiceFinalized)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.InvoiceMarkedUncollectible)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.InvoicePaid)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.InvoicePaymentActionRequired)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.InvoicePaymentFailed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.InvoicePaymentSucceeded)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.InvoiceSent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.InvoiceUpcoming)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.InvoiceUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.InvoiceVoided)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IssuingAuthorizationCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IssuingAuthorizationUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IssuingCardCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IssuingCardUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IssuingCardholderCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IssuingCardholderUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IssuingDisputeClosed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IssuingDisputeCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IssuingDisputeFundsReinstated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IssuingDisputeSubmitted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IssuingDisputeUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IssuingTokenCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IssuingTokenUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IssuingTransactionCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.IssuingTransactionUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.MandateUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PaymentIntentAmountCapturableUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PaymentIntentCanceled)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PaymentIntentCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PaymentIntentPartiallyFunded)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PaymentIntentPaymentFailed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PaymentIntentProcessing)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PaymentIntentRequiresAction)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PaymentIntentSucceeded)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PaymentLinkCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PaymentLinkUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PaymentMethodAttached)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PaymentMethodAutomaticallyUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PaymentMethodDetached)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PaymentMethodUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PayoutCanceled)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PayoutCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PayoutFailed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PayoutPaid)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PayoutReconciliationCompleted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PayoutUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PersonCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PersonDeleted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PersonUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PlanCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PlanDeleted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PlanUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PriceCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PriceDeleted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PriceUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ProductCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ProductDeleted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ProductUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PromotionCodeCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.PromotionCodeUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.QuoteAccepted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.QuoteCanceled)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.QuoteCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.QuoteFinalized)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.RadarEarlyFraudWarningCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.RadarEarlyFraudWarningUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.RefundCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.RefundUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ReportingReportRunFailed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ReportingReportRunSucceeded)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ReviewClosed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.ReviewOpened)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SetupIntentCanceled)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SetupIntentCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SetupIntentRequiresAction)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SetupIntentSetupFailed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SetupIntentSucceeded)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SigmaScheduledQueryRunCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SourceCanceled)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SourceChargeable)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SourceFailed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SourceMandateNotification)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SourceRefundAttributesRequired)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SourceTransactionCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SourceTransactionUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SubscriptionScheduleAborted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SubscriptionScheduleCanceled)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SubscriptionScheduleCompleted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SubscriptionScheduleCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SubscriptionScheduleExpiring)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SubscriptionScheduleReleased)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.SubscriptionScheduleUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.TaxSettingsUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.TaxRateCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.TaxRateUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.TerminalReaderActionFailed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.TerminalReaderActionSucceeded)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.TestHelpersTestClockAdvancing)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.TestHelpersTestClockCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.TestHelpersTestClockDeleted)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.TestHelpersTestClockInternalFailure)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.TestHelpersTestClockReady)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.TopupCanceled)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.TopupCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.TopupFailed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.TopupReversed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.TopupSucceeded)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.TransferCreated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.TransferReversed)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (stripeEvent.Type == Events.TransferUpdated)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
// ... handle other event types
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Unhandled event type: {0}", stripeEvent.Type);
|
||||||
|
}
|
||||||
|
return Ok();
|
||||||
|
}
|
||||||
|
|
||||||
[Authorize("read:request")]
|
[Authorize("read:request")]
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Route("Customer/Requests")]
|
[Route("Customer/Requests")]
|
||||||
@ -140,7 +772,7 @@ public class RequestsController : Controller
|
|||||||
|
|
||||||
if(request==null)
|
if(request==null)
|
||||||
return NotFound();
|
return NotFound();
|
||||||
|
var paymentUrl = _paymentService.Charge(request.Id,request.Artist.StripeAccountId,Convert.ToDouble(request.Amount));
|
||||||
request.Accepted = true;
|
request.Accepted = true;
|
||||||
request.AcceptedDate = DateTime.UtcNow;
|
request.AcceptedDate = DateTime.UtcNow;
|
||||||
_dbContext.Entry(request).State = EntityState.Modified;
|
_dbContext.Entry(request).State = EntityState.Modified;
|
||||||
|
@ -12,6 +12,9 @@ public class Request
|
|||||||
public DateTime? AcceptedDate { get; set; }
|
public DateTime? AcceptedDate { get; set; }
|
||||||
public bool Declined { get; set; } = false;
|
public bool Declined { get; set; } = false;
|
||||||
public DateTime? DeclinedDate { get; set; }
|
public DateTime? DeclinedDate { get; set; }
|
||||||
|
public string? PaymentUrl { get; set; }
|
||||||
|
public bool Paid { get; set; } = false;
|
||||||
|
public DateTime? PaidDate { get; set; } = null!;
|
||||||
public bool Completed { get; set; } = false;
|
public bool Completed { get; set; } = false;
|
||||||
public DateTime? CompletedDate { get; set; }
|
public DateTime? CompletedDate { get; set; }
|
||||||
|
|
||||||
|
@ -3,6 +3,10 @@ using comissions.app.api.Services.Payment;
|
|||||||
using comissions.app.database;
|
using comissions.app.database;
|
||||||
using comissions.app.database.Entities;
|
using comissions.app.database.Entities;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Novu;
|
||||||
|
using Novu.Interfaces;
|
||||||
|
using Novu.DTO;
|
||||||
|
using Novu.DTO.Subscribers;
|
||||||
|
|
||||||
namespace comissions.app.api.Middleware;
|
namespace comissions.app.api.Middleware;
|
||||||
|
|
||||||
@ -10,10 +14,11 @@ namespace comissions.app.api.Middleware;
|
|||||||
public class UserMiddleware
|
public class UserMiddleware
|
||||||
{
|
{
|
||||||
private readonly RequestDelegate _next;
|
private readonly RequestDelegate _next;
|
||||||
|
private readonly NovuClient _client;
|
||||||
public UserMiddleware(RequestDelegate next)
|
public UserMiddleware(RequestDelegate next, NovuClient client)
|
||||||
{
|
{
|
||||||
_next = next;
|
_next = next;
|
||||||
|
_client = client;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task InvokeAsync(HttpContext context, ApplicationDbContext dbContext, IPaymentService paymentService)
|
public async Task InvokeAsync(HttpContext context, ApplicationDbContext dbContext, IPaymentService paymentService)
|
||||||
@ -43,6 +48,15 @@ public class UserMiddleware
|
|||||||
await dbContext.SaveChangesAsync();
|
await dbContext.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var newSubscriberDto = new SubscriberCreateData()
|
||||||
|
{
|
||||||
|
SubscriberId = userId, //replace with system_internal_user_id
|
||||||
|
FirstName = user.DisplayName,
|
||||||
|
LastName = "",
|
||||||
|
Email = user.Email
|
||||||
|
};
|
||||||
|
var subscriber = await _client.Subscriber.Create(newSubscriberDto);
|
||||||
|
|
||||||
if (user.Suspended)
|
if (user.Suspended)
|
||||||
{
|
{
|
||||||
if (user.UnsuspendDate < DateTime.UtcNow)
|
if (user.UnsuspendDate < DateTime.UtcNow)
|
||||||
|
493
src/comissions.app.api/Migrations/20240223013625_moar.Designer.cs
generated
Normal file
493
src/comissions.app.api/Migrations/20240223013625_moar.Designer.cs
generated
Normal file
@ -0,0 +1,493 @@
|
|||||||
|
// <auto-generated />
|
||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
|
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||||
|
using comissions.app.database;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace comissions.app.api.Migrations
|
||||||
|
{
|
||||||
|
[DbContext(typeof(ApplicationDbContext))]
|
||||||
|
[Migration("20240223013625_moar")]
|
||||||
|
partial class moar
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
#pragma warning disable 612, 618
|
||||||
|
modelBuilder
|
||||||
|
.HasAnnotation("ProductVersion", "8.0.1")
|
||||||
|
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||||
|
|
||||||
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||||
|
|
||||||
|
modelBuilder.Entity("comissions.app.database.Entities.ArtistPageSettings", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<int>("ArtistId")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<string>("BackgroundColor")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("DescriptionBackgroundColor")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("DescriptionHeaderColor")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("DescriptionHeaderImageUrl")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<int>("DescriptionHeaderSize")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<string>("DescriptionHeaderText")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<bool>("DescriptionHeaderUseImage")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<string>("DescriptionTextColor")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<int>("DescriptionTextSize")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<string>("HeaderColor")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("HeaderImageUrl")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<int>("HeaderTextSize")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<bool>("HeaderUseImage")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<string>("PortfolioBackgroundColor")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<int>("PortfolioColumns")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<bool>("PortfolioEnabledScrolling")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<bool>("PortfolioMasonry")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<int>("PortfolioMaximumSize")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<string>("PortfolionHeaderColor")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("PortfolionHeaderImageUrl")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<int>("PortfolionHeaderSize")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<string>("PortfolionHeaderText")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<bool>("PortfolionHeaderUseImage")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<string>("RequestBackgroundColor")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("RequestButtonBGColor")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("RequestButtonHoverBGColor")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("RequestButtonHoverTextColor")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("RequestButtonTextColor")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("RequestHeaderColor")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("RequestHeaderImageUrl")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<int>("RequestHeaderSize")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<string>("RequestHeaderText")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<bool>("RequestHeaderUseImage")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<string>("RequestTermsColor")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("ArtistId")
|
||||||
|
.IsUnique();
|
||||||
|
|
||||||
|
b.ToTable("ArtistPageSettings");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("comissions.app.database.Entities.ArtistPortfolioPiece", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<int>("ArtistId")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<string>("FileReference")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("ArtistId");
|
||||||
|
|
||||||
|
b.ToTable("ArtistPortfolioPieces");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("comissions.app.database.Entities.ArtistRequest", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<bool>("Accepted")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("AcceptedDate")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Message")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<DateTime>("RequestDate")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("UserId")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("UserId");
|
||||||
|
|
||||||
|
b.ToTable("ArtistRequests");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("comissions.app.database.Entities.Request", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<bool>("Accepted")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("AcceptedDate")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<decimal>("Amount")
|
||||||
|
.HasColumnType("numeric");
|
||||||
|
|
||||||
|
b.Property<int>("ArtistId")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<bool>("Completed")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("CompletedDate")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<bool>("Declined")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("DeclinedDate")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("Message")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<bool>("Paid")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("PaidDate")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("PaymentUrl")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<DateTime>("RequestDate")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("UserId")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("ArtistId");
|
||||||
|
|
||||||
|
b.HasIndex("UserId");
|
||||||
|
|
||||||
|
b.ToTable("Requests");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("comissions.app.database.Entities.User", b =>
|
||||||
|
{
|
||||||
|
b.Property<string>("Id")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("BanAdminId")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<bool>("Banned")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("BannedDate")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("BannedReason")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("Biography")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("DisplayName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("Email")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("SuspendAdminId")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<bool>("Suspended")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("SuspendedDate")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("SuspendedReason")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("UnbanDate")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("UnsuspendDate")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<int?>("UserArtistId")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.ToTable("Users");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("comissions.app.database.Entities.UserArtist", b =>
|
||||||
|
{
|
||||||
|
b.Property<int>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||||
|
|
||||||
|
b.Property<bool>("AgeRestricted")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<int>("ArtistPageSettingsId")
|
||||||
|
.HasColumnType("integer");
|
||||||
|
|
||||||
|
b.Property<string>("Description")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("Name")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<bool>("PrepaymentRequired")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<string>("RequestGuidelines")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("SocialMediaLink1")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("SocialMediaLink2")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("SocialMediaLink3")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("SocialMediaLink4")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("StripeAccountId")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<string>("SuspendAdminId")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<bool>("Suspended")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("SuspendedDate")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("SuspendedReason")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("UnsuspendDate")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("UserId")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("UserId")
|
||||||
|
.IsUnique();
|
||||||
|
|
||||||
|
b.ToTable("UserArtists");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("comissions.app.database.Entities.ArtistPageSettings", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("comissions.app.database.Entities.UserArtist", "Artist")
|
||||||
|
.WithOne("ArtistPageSettings")
|
||||||
|
.HasForeignKey("comissions.app.database.Entities.ArtistPageSettings", "ArtistId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Artist");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("comissions.app.database.Entities.ArtistPortfolioPiece", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("comissions.app.database.Entities.UserArtist", "Artist")
|
||||||
|
.WithMany("PortfolioPieces")
|
||||||
|
.HasForeignKey("ArtistId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Artist");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("comissions.app.database.Entities.ArtistRequest", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("comissions.app.database.Entities.User", "User")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("UserId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("User");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("comissions.app.database.Entities.Request", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("comissions.app.database.Entities.UserArtist", "Artist")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("ArtistId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.HasOne("comissions.app.database.Entities.User", "User")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("UserId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("Artist");
|
||||||
|
|
||||||
|
b.Navigation("User");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("comissions.app.database.Entities.UserArtist", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("comissions.app.database.Entities.User", "User")
|
||||||
|
.WithOne("UserArtist")
|
||||||
|
.HasForeignKey("comissions.app.database.Entities.UserArtist", "UserId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("User");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("comissions.app.database.Entities.User", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("UserArtist");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("comissions.app.database.Entities.UserArtist", b =>
|
||||||
|
{
|
||||||
|
b.Navigation("ArtistPageSettings")
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.Navigation("PortfolioPieces");
|
||||||
|
});
|
||||||
|
#pragma warning restore 612, 618
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
50
src/comissions.app.api/Migrations/20240223013625_moar.cs
Normal file
50
src/comissions.app.api/Migrations/20240223013625_moar.cs
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace comissions.app.api.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class moar : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.AddColumn<bool>(
|
||||||
|
name: "Paid",
|
||||||
|
table: "Requests",
|
||||||
|
type: "boolean",
|
||||||
|
nullable: false,
|
||||||
|
defaultValue: false);
|
||||||
|
|
||||||
|
migrationBuilder.AddColumn<DateTime>(
|
||||||
|
name: "PaidDate",
|
||||||
|
table: "Requests",
|
||||||
|
type: "timestamp with time zone",
|
||||||
|
nullable: true);
|
||||||
|
|
||||||
|
migrationBuilder.AddColumn<string>(
|
||||||
|
name: "PaymentUrl",
|
||||||
|
table: "Requests",
|
||||||
|
type: "text",
|
||||||
|
nullable: true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropColumn(
|
||||||
|
name: "Paid",
|
||||||
|
table: "Requests");
|
||||||
|
|
||||||
|
migrationBuilder.DropColumn(
|
||||||
|
name: "PaidDate",
|
||||||
|
table: "Requests");
|
||||||
|
|
||||||
|
migrationBuilder.DropColumn(
|
||||||
|
name: "PaymentUrl",
|
||||||
|
table: "Requests");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -254,6 +254,15 @@ namespace comissions.app.api.Migrations
|
|||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasColumnType("text");
|
.HasColumnType("text");
|
||||||
|
|
||||||
|
b.Property<bool>("Paid")
|
||||||
|
.HasColumnType("boolean");
|
||||||
|
|
||||||
|
b.Property<DateTime?>("PaidDate")
|
||||||
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
b.Property<string>("PaymentUrl")
|
||||||
|
.HasColumnType("text");
|
||||||
|
|
||||||
b.Property<DateTime>("RequestDate")
|
b.Property<DateTime>("RequestDate")
|
||||||
.HasColumnType("timestamp with time zone");
|
.HasColumnType("timestamp with time zone");
|
||||||
|
|
||||||
|
@ -12,6 +12,11 @@ using Microsoft.EntityFrameworkCore;
|
|||||||
using Microsoft.Extensions.FileProviders;
|
using Microsoft.Extensions.FileProviders;
|
||||||
using Microsoft.IdentityModel.Tokens;
|
using Microsoft.IdentityModel.Tokens;
|
||||||
using Microsoft.OpenApi.Models;
|
using Microsoft.OpenApi.Models;
|
||||||
|
using Novu;
|
||||||
|
using Novu.DTO;
|
||||||
|
using Novu.Extensions;
|
||||||
|
using Novu.Interfaces;
|
||||||
|
using Novu.Models;
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
@ -75,6 +80,7 @@ builder.Services.AddSwaggerGen(options =>
|
|||||||
options.IncludeXmlComments(xmlPath);
|
options.IncludeXmlComments(xmlPath);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
builder.Services.RegisterNovuClients(builder.Configuration);
|
||||||
|
|
||||||
builder.Services.AddControllers()
|
builder.Services.AddControllers()
|
||||||
.AddJsonOptions(options=>
|
.AddJsonOptions(options=>
|
||||||
|
@ -7,5 +7,5 @@ public interface IPaymentService
|
|||||||
string CreateArtistAccount();
|
string CreateArtistAccount();
|
||||||
string CreateArtistAccountOnboardingUrl(string accountId);
|
string CreateArtistAccountOnboardingUrl(string accountId);
|
||||||
bool ArtistAccountIsOnboarded(string accountId);
|
bool ArtistAccountIsOnboarded(string accountId);
|
||||||
string ChargeForService(int orderArtistServiceId, string? sellerStripeAccountId, double orderPrice);
|
string Charge(int orderArtistServiceId, string? sellerStripeAccountId, double orderPrice);
|
||||||
}
|
}
|
@ -71,8 +71,8 @@ public class StripePaymentServiceProvider:IPaymentService
|
|||||||
var options = new AccountLinkCreateOptions
|
var options = new AccountLinkCreateOptions
|
||||||
{
|
{
|
||||||
Account = accountId,
|
Account = accountId,
|
||||||
RefreshUrl = $"{_baseUiUrl}/artistDashboard",
|
RefreshUrl = $"{_baseUiUrl}/dashboard",
|
||||||
ReturnUrl = $"{_baseUiUrl}/artistDashboard",
|
ReturnUrl = $"{_baseUiUrl}/dashboard",
|
||||||
Type = "account_onboarding",
|
Type = "account_onboarding",
|
||||||
};
|
};
|
||||||
var service = new AccountLinkService();
|
var service = new AccountLinkService();
|
||||||
@ -87,10 +87,10 @@ public class StripePaymentServiceProvider:IPaymentService
|
|||||||
return account.Requirements.CurrentlyDue.Count == 0 && account.ChargesEnabled==true && account.DetailsSubmitted==true;
|
return account.Requirements.CurrentlyDue.Count == 0 && account.ChargesEnabled==true && account.DetailsSubmitted==true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string ChargeForService(int orderArtistServiceOrderId, string? sellerStripeAccountId,
|
public string Charge(int requestId, string? sellerStripeAccountId,
|
||||||
double orderPrice)
|
double requestAmount)
|
||||||
{
|
{
|
||||||
var feeAmount = (long)Math.Round((orderPrice*0.05) * 100);
|
var feeAmount = (long)Math.Round((requestAmount*0.05) * 100);
|
||||||
var options = new Stripe.Checkout.SessionCreateOptions
|
var options = new Stripe.Checkout.SessionCreateOptions
|
||||||
{
|
{
|
||||||
LineItems = new List<Stripe.Checkout.SessionLineItemOptions> {
|
LineItems = new List<Stripe.Checkout.SessionLineItemOptions> {
|
||||||
@ -98,7 +98,7 @@ public class StripePaymentServiceProvider:IPaymentService
|
|||||||
{
|
{
|
||||||
PriceData = new Stripe.Checkout.SessionLineItemPriceDataOptions
|
PriceData = new Stripe.Checkout.SessionLineItemPriceDataOptions
|
||||||
{
|
{
|
||||||
UnitAmount = (long)Math.Round(orderPrice * 100),
|
UnitAmount = (long)Math.Round(requestAmount * 100),
|
||||||
Currency = "usd",
|
Currency = "usd",
|
||||||
ProductData = new Stripe.Checkout.SessionLineItemPriceDataProductDataOptions
|
ProductData = new Stripe.Checkout.SessionLineItemPriceDataProductDataOptions
|
||||||
{
|
{
|
||||||
@ -113,11 +113,11 @@ public class StripePaymentServiceProvider:IPaymentService
|
|||||||
ApplicationFeeAmount = feeAmount,
|
ApplicationFeeAmount = feeAmount,
|
||||||
},
|
},
|
||||||
Mode = "payment",
|
Mode = "payment",
|
||||||
SuccessUrl = "https://example.com/success",
|
SuccessUrl = $"{_baseUiUrl}/dashboard/requests/{requestId}",
|
||||||
CancelUrl = "https://example.com/failure",
|
CancelUrl = $"{_baseUiUrl}/dashboard/requests/{requestId}",
|
||||||
Metadata = new Dictionary<string, string>()
|
Metadata = new Dictionary<string, string>()
|
||||||
{
|
{
|
||||||
["orderId"] = orderArtistServiceOrderId.ToString()
|
["orderId"] = requestId.ToString()
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
var requestOptions = new RequestOptions
|
var requestOptions = new RequestOptions
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
"UI": {
|
"UI": {
|
||||||
"BaseUrl": "http://localhost:3000"
|
"BaseUrl": "http://localhost:3000"
|
||||||
},
|
},
|
||||||
|
"Novu": {
|
||||||
|
"ApiKey": "287ad99d1cbeba7f96a7d2637b022e6f"
|
||||||
|
},
|
||||||
"Database": {
|
"Database": {
|
||||||
"Database": "comissionsapp",
|
"Database": "comissionsapp",
|
||||||
"Host": "localhost",
|
"Host": "localhost",
|
||||||
|
@ -20,6 +20,9 @@
|
|||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.1" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="8.0.1" />
|
||||||
|
<PackageReference Include="Novu" Version="0.3.3" />
|
||||||
|
<PackageReference Include="Novu.Extensions" Version="0.3.3" />
|
||||||
|
<PackageReference Include="Novu.Sync" Version="0.3.3" />
|
||||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.0" />
|
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.0" />
|
||||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL.Design" Version="1.1.0" />
|
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL.Design" Version="1.1.0" />
|
||||||
<PackageReference Include="Stripe.net" Version="43.12.0" />
|
<PackageReference Include="Stripe.net" Version="43.12.0" />
|
||||||
|
@ -13,7 +13,7 @@ using System.Reflection;
|
|||||||
[assembly: System.Reflection.AssemblyCompanyAttribute("comissions.app.database.migrator")]
|
[assembly: System.Reflection.AssemblyCompanyAttribute("comissions.app.database.migrator")]
|
||||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+8f8b18a46c0d2d56708815efa9b6359a92aa9bdc")]
|
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+04861b6b58dd552f5a309afc249a59707799da37")]
|
||||||
[assembly: System.Reflection.AssemblyProductAttribute("comissions.app.database.migrator")]
|
[assembly: System.Reflection.AssemblyProductAttribute("comissions.app.database.migrator")]
|
||||||
[assembly: System.Reflection.AssemblyTitleAttribute("comissions.app.database.migrator")]
|
[assembly: System.Reflection.AssemblyTitleAttribute("comissions.app.database.migrator")]
|
||||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||||
|
@ -1 +1 @@
|
|||||||
f400a3f8c8fe637929ec13e1f2608e512902861c6e8ba22bc4291585fdb672de
|
f6d1d126af9b4482ad74b31893663f1ef7fa48b4f281e3af0a28cd303ade7752
|
||||||
|
@ -1 +1 @@
|
|||||||
17077084151680581
|
17086505533886000
|
Loading…
x
Reference in New Issue
Block a user