diff --git a/client/MAVN.Service.CustomerProfile.Client/Api/IPaymentProviderDetailsApi.cs b/client/MAVN.Service.CustomerProfile.Client/Api/IPaymentProviderDetailsApi.cs new file mode 100644 index 0000000..d944ed9 --- /dev/null +++ b/client/MAVN.Service.CustomerProfile.Client/Api/IPaymentProviderDetailsApi.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Net; +using System.Threading.Tasks; +using MAVN.Service.CustomerProfile.Client.Models.Enums; +using MAVN.Service.CustomerProfile.Client.Models.Requests; +using MAVN.Service.CustomerProfile.Client.Models.Responses; +using Microsoft.AspNetCore.Mvc; +using Refit; + +namespace MAVN.Service.CustomerProfile.Client.Api +{ + /// + /// PaymentProviderDetails API + /// + public interface IPaymentProviderDetailsApi + { + /// + /// Creates payment provider details + /// + /// + [Post("/api/paymentProviderDetails")] + Task CreateAsync([Body] CreatePaymentProviderDetailsRequest request); + + /// + /// Updates payment provider details + /// + /// + [Put("/api/paymentProviderDetails")] + [ProducesResponseType(typeof(PaymentProviderDetailsErrorCodes), (int) HttpStatusCode.OK)] + Task UpdateAsync([Body] EditPaymentProviderDetailsRequest request); + + /// + /// Deletes payment provider details + /// + /// + [Delete("/api/paymentProviderDetails/{id}")] + Task DeleteAsync(Guid id); + + /// + /// Returns all payment provider details for specific partner + /// + /// + [Get("/api/paymentProviderDetails/{partnerId}")] + Task> GetListByPartnerIdAsync([FromRoute] Guid partnerId); + + /// + /// Returns all payment provider details for specific partner + /// + /// + [Get("/api/paymentProviderDetails")] + Task GetByPartnerIdAndPaymentProviderAsync([Query]Guid partnerId, + [Query]string paymentProvider); + } +} diff --git a/client/MAVN.Service.CustomerProfile.Client/CustomerProfileClient.cs b/client/MAVN.Service.CustomerProfile.Client/CustomerProfileClient.cs index 13d0099..942ef0f 100644 --- a/client/MAVN.Service.CustomerProfile.Client/CustomerProfileClient.cs +++ b/client/MAVN.Service.CustomerProfile.Client/CustomerProfileClient.cs @@ -1,4 +1,4 @@ -using Lykke.HttpClientGenerator; +using Lykke.HttpClientGenerator; using MAVN.Service.CustomerProfile.Client.Api; namespace MAVN.Service.CustomerProfile.Client @@ -19,6 +19,7 @@ public CustomerProfileClient(IHttpClientGenerator httpClientGenerator) ReferralFriendProfiles = httpClientGenerator.Generate(); Statistics = httpClientGenerator.Generate(); CustomerPhones = httpClientGenerator.Generate(); + PaymentProviderDetails = httpClientGenerator.Generate(); } /// @@ -44,5 +45,8 @@ public CustomerProfileClient(IHttpClientGenerator httpClientGenerator) /// public ICustomerPhonesApi CustomerPhones { get; } + + /// + public IPaymentProviderDetailsApi PaymentProviderDetails { get; } } } diff --git a/client/MAVN.Service.CustomerProfile.Client/ICustomerProfileClient.cs b/client/MAVN.Service.CustomerProfile.Client/ICustomerProfileClient.cs index eeaa06c..f22f2d0 100644 --- a/client/MAVN.Service.CustomerProfile.Client/ICustomerProfileClient.cs +++ b/client/MAVN.Service.CustomerProfile.Client/ICustomerProfileClient.cs @@ -1,4 +1,4 @@ -using JetBrains.Annotations; +using JetBrains.Annotations; using MAVN.Service.CustomerProfile.Client.Api; namespace MAVN.Service.CustomerProfile.Client @@ -48,5 +48,10 @@ public interface ICustomerProfileClient /// CustomerPhones API. /// ICustomerPhonesApi CustomerPhones { get; } + + /// + /// PaymentProviderDetails API. + /// + IPaymentProviderDetailsApi PaymentProviderDetails { get; } } } diff --git a/client/MAVN.Service.CustomerProfile.Client/Models/Enums/PaymentProviderDetailsErrorCodes.cs b/client/MAVN.Service.CustomerProfile.Client/Models/Enums/PaymentProviderDetailsErrorCodes.cs new file mode 100644 index 0000000..86b18b5 --- /dev/null +++ b/client/MAVN.Service.CustomerProfile.Client/Models/Enums/PaymentProviderDetailsErrorCodes.cs @@ -0,0 +1,24 @@ +using JetBrains.Annotations; + +namespace MAVN.Service.CustomerProfile.Client.Models.Enums +{ + /// + /// Enumeration that holds error codes for payment provider details operations + /// + [PublicAPI] + public enum PaymentProviderDetailsErrorCodes + { + /// + /// No errors + /// + None, + /// + /// Payment provider details does not exist + /// + PaymentProviderDetailsDoesNotExist, + /// + /// There is already existing unique pair for this partner and provider + /// + PaymentProviderDetailsAlreadyExists + } +} diff --git a/client/MAVN.Service.CustomerProfile.Client/Models/Requests/CreatePaymentProviderDetailsRequest.cs b/client/MAVN.Service.CustomerProfile.Client/Models/Requests/CreatePaymentProviderDetailsRequest.cs new file mode 100644 index 0000000..77a9382 --- /dev/null +++ b/client/MAVN.Service.CustomerProfile.Client/Models/Requests/CreatePaymentProviderDetailsRequest.cs @@ -0,0 +1,31 @@ +using System; +using System.ComponentModel.DataAnnotations; +using JetBrains.Annotations; + +namespace MAVN.Service.CustomerProfile.Client.Models.Requests +{ + /// + /// Request model to create payment provider details + /// + [PublicAPI] + public class CreatePaymentProviderDetailsRequest + { + /// + /// The id of the partner + /// + [Required] + public Guid PartnerId { get; set; } + + /// + /// the payment provider used + /// + [Required] + public string PaymentIntegrationProvider { get; set; } + + /// + /// Configuration properties for the payment provider (json) + /// + [Required] + public string PaymentIntegrationProperties { get; set; } + } +} diff --git a/client/MAVN.Service.CustomerProfile.Client/Models/Requests/EditPaymentProviderDetailsRequest.cs b/client/MAVN.Service.CustomerProfile.Client/Models/Requests/EditPaymentProviderDetailsRequest.cs new file mode 100644 index 0000000..5f79f1a --- /dev/null +++ b/client/MAVN.Service.CustomerProfile.Client/Models/Requests/EditPaymentProviderDetailsRequest.cs @@ -0,0 +1,19 @@ +using System; +using System.ComponentModel.DataAnnotations; +using JetBrains.Annotations; + +namespace MAVN.Service.CustomerProfile.Client.Models.Requests +{ + /// + /// Edit request model + /// + [PublicAPI] + public class EditPaymentProviderDetailsRequest : CreatePaymentProviderDetailsRequest + { + /// + /// Id of the details model + /// + [Required] + public Guid Id { get; set; } + } +} diff --git a/client/MAVN.Service.CustomerProfile.Client/Models/Responses/GetByPartnerIdAndPaymentProviderResponse.cs b/client/MAVN.Service.CustomerProfile.Client/Models/Responses/GetByPartnerIdAndPaymentProviderResponse.cs new file mode 100644 index 0000000..1de942a --- /dev/null +++ b/client/MAVN.Service.CustomerProfile.Client/Models/Responses/GetByPartnerIdAndPaymentProviderResponse.cs @@ -0,0 +1,22 @@ +using JetBrains.Annotations; +using MAVN.Service.CustomerProfile.Client.Models.Enums; + +namespace MAVN.Service.CustomerProfile.Client.Models.Responses +{ + /// + /// Response model + /// + [PublicAPI] + public class GetByPartnerIdAndPaymentProviderResponse + { + /// + /// Payment provider information + /// + public PaymentProviderDetails PaymentProviderDetails { get; set; } + + /// + /// Error + /// + public PaymentProviderDetailsErrorCodes ErrorCode { get; set; } + } +} diff --git a/client/MAVN.Service.CustomerProfile.Client/Models/Responses/PaymentProviderDetails.cs b/client/MAVN.Service.CustomerProfile.Client/Models/Responses/PaymentProviderDetails.cs new file mode 100644 index 0000000..36f051d --- /dev/null +++ b/client/MAVN.Service.CustomerProfile.Client/Models/Responses/PaymentProviderDetails.cs @@ -0,0 +1,32 @@ +using System; +using JetBrains.Annotations; + +namespace MAVN.Service.CustomerProfile.Client.Models.Responses +{ + /// + /// Holds payment provider details + /// + [PublicAPI] + public class PaymentProviderDetails + { + /// + /// Id of the details + /// + public Guid Id { get; set; } + + /// + /// Id of the partner + /// + public Guid PartnerId { get; set; } + + /// + /// Name of the payment provider + /// + public string PaymentIntegrationProvider { get; set; } + + /// + /// Payment integration properties for the provider + /// + public string PaymentIntegrationProperties { get; set; } + } +} diff --git a/readme-images/customer-profile-kubernetes.jpg b/readme-images/customer-profile-kubernetes.jpg index 918b66a..e537cdf 100644 Binary files a/readme-images/customer-profile-kubernetes.jpg and b/readme-images/customer-profile-kubernetes.jpg differ diff --git a/src/MAVN.Service.CustomerProfile.Domain/Enums/PaymentProviderDetailsErrorCodes.cs b/src/MAVN.Service.CustomerProfile.Domain/Enums/PaymentProviderDetailsErrorCodes.cs new file mode 100644 index 0000000..583abe8 --- /dev/null +++ b/src/MAVN.Service.CustomerProfile.Domain/Enums/PaymentProviderDetailsErrorCodes.cs @@ -0,0 +1,9 @@ +namespace MAVN.Service.CustomerProfile.Domain.Enums +{ + public enum PaymentProviderDetailsErrorCodes + { + None, + PaymentProviderDetailsDoesNotExist, + PaymentProviderDetailsAlreadyExists + } +} diff --git a/src/MAVN.Service.CustomerProfile.Domain/Models/IPaymentProviderDetails.cs b/src/MAVN.Service.CustomerProfile.Domain/Models/IPaymentProviderDetails.cs new file mode 100644 index 0000000..825773d --- /dev/null +++ b/src/MAVN.Service.CustomerProfile.Domain/Models/IPaymentProviderDetails.cs @@ -0,0 +1,15 @@ +using System; + +namespace MAVN.Service.CustomerProfile.Domain.Models +{ + public interface IPaymentProviderDetails + { + Guid Id { get; set; } + + Guid PartnerId { get; set; } + + string PaymentIntegrationProvider { get; set; } + + string PaymentIntegrationProperties { get; set; } + } +} diff --git a/src/MAVN.Service.CustomerProfile.Domain/Repositories/IPaymentProviderDetailsRepository.cs b/src/MAVN.Service.CustomerProfile.Domain/Repositories/IPaymentProviderDetailsRepository.cs new file mode 100644 index 0000000..d09f1d8 --- /dev/null +++ b/src/MAVN.Service.CustomerProfile.Domain/Repositories/IPaymentProviderDetailsRepository.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using MAVN.Service.CustomerProfile.Domain.Models; + +namespace MAVN.Service.CustomerProfile.Domain.Repositories +{ + public interface IPaymentProviderDetailsRepository + { + Task CreateAsync(IPaymentProviderDetails model); + Task UpdateAsync(IPaymentProviderDetails model); + Task DeleteAsync(Guid id); + Task> GetListByPartnerIdAsync(Guid partnerId); + Task GetByPartnerIdAndProviderAsync(Guid partnerId, string paymentProvider); + } +} diff --git a/src/MAVN.Service.CustomerProfile.Domain/Services/IPaymentProviderDetailsService.cs b/src/MAVN.Service.CustomerProfile.Domain/Services/IPaymentProviderDetailsService.cs new file mode 100644 index 0000000..900bd1e --- /dev/null +++ b/src/MAVN.Service.CustomerProfile.Domain/Services/IPaymentProviderDetailsService.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using MAVN.Service.CustomerProfile.Domain.Enums; +using MAVN.Service.CustomerProfile.Domain.Models; + +namespace MAVN.Service.CustomerProfile.Domain.Services +{ + public interface IPaymentProviderDetailsService + { + Task CreateAsync(IPaymentProviderDetails model); + Task UpdateAsync(IPaymentProviderDetails model); + Task DeleteAsync(Guid id); + Task> GetListByPartnerIdAsync(Guid partnerId); + Task GetByPartnerIdAndPaymentProviderAsync(Guid partnerId, string paymentProvider); + } +} diff --git a/src/MAVN.Service.CustomerProfile.DomainServices/PaymentProviderDetailsService.cs b/src/MAVN.Service.CustomerProfile.DomainServices/PaymentProviderDetailsService.cs new file mode 100644 index 0000000..8ae8fdd --- /dev/null +++ b/src/MAVN.Service.CustomerProfile.DomainServices/PaymentProviderDetailsService.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using MAVN.Service.CustomerProfile.Domain.Enums; +using MAVN.Service.CustomerProfile.Domain.Models; +using MAVN.Service.CustomerProfile.Domain.Repositories; +using MAVN.Service.CustomerProfile.Domain.Services; + +namespace MAVN.Service.CustomerProfile.DomainServices +{ + public class PaymentProviderDetailsService : IPaymentProviderDetailsService + { + private readonly IPaymentProviderDetailsRepository _paymentProviderDetailsRepository; + + public PaymentProviderDetailsService(IPaymentProviderDetailsRepository paymentProviderDetailsRepository) + { + _paymentProviderDetailsRepository = paymentProviderDetailsRepository; + } + + public async Task CreateAsync(IPaymentProviderDetails model) + { + var existingPaymentProviderDetails = + await _paymentProviderDetailsRepository.GetByPartnerIdAndProviderAsync(model.PartnerId, + model.PaymentIntegrationProvider); + + if (existingPaymentProviderDetails != null) + return PaymentProviderDetailsErrorCodes.PaymentProviderDetailsAlreadyExists; + + await _paymentProviderDetailsRepository.CreateAsync(model); + + return PaymentProviderDetailsErrorCodes.None; + } + + public async Task UpdateAsync(IPaymentProviderDetails model) + { + var existingPaymentProviderDetails = + await _paymentProviderDetailsRepository.GetByPartnerIdAndProviderAsync(model.PartnerId, + model.PaymentIntegrationProvider); + + if ( existingPaymentProviderDetails != null && existingPaymentProviderDetails.Id != model.Id) + return PaymentProviderDetailsErrorCodes.PaymentProviderDetailsAlreadyExists; + + var isUpdated = await _paymentProviderDetailsRepository.UpdateAsync(model); + + return isUpdated + ? PaymentProviderDetailsErrorCodes.None + : PaymentProviderDetailsErrorCodes.PaymentProviderDetailsDoesNotExist; + } + + public async Task DeleteAsync(Guid id) + { + var isDeleted = await _paymentProviderDetailsRepository.DeleteAsync(id); + + return isDeleted + ? PaymentProviderDetailsErrorCodes.None + : PaymentProviderDetailsErrorCodes.PaymentProviderDetailsDoesNotExist; + } + + public Task> GetListByPartnerIdAsync(Guid partnerId) + { + var result = _paymentProviderDetailsRepository.GetListByPartnerIdAsync(partnerId); + return result; + } + + public Task GetByPartnerIdAndPaymentProviderAsync(Guid partnerId, + string paymentProvider) + { + var result = _paymentProviderDetailsRepository.GetByPartnerIdAndProviderAsync(partnerId, paymentProvider); + return result; + } + } +} diff --git a/src/MAVN.Service.CustomerProfile.MsSqlRepositories/CustomerProfileContext.cs b/src/MAVN.Service.CustomerProfile.MsSqlRepositories/CustomerProfileContext.cs index 481691a..0b4b74f 100644 --- a/src/MAVN.Service.CustomerProfile.MsSqlRepositories/CustomerProfileContext.cs +++ b/src/MAVN.Service.CustomerProfile.MsSqlRepositories/CustomerProfileContext.cs @@ -36,6 +36,8 @@ public class CustomerProfileContext : MsSqlContext internal DbSet ReferralFriendProfiles { get; set; } + internal DbSet PaymentProviderDetails { get; set; } + internal DbSet ReferralFriendProfilesArchive { get; set; } [UsedImplicitly] @@ -114,6 +116,13 @@ protected override void OnLykkeModelCreating(ModelBuilder modelBuilder) modelBuilder.Entity() .HasIndex(c => c.PhoneNumber); + + // configuring payment_provider_details table + modelBuilder.Entity() + .HasIndex(c => c.PartnerId).IsUnique(false); + + modelBuilder.Entity() + .HasIndex(c => new { c.PartnerId, c.PaymentIntegrationProvider }).IsUnique(); } } } diff --git a/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Entities/PaymentProviderDetailsEntity.cs b/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Entities/PaymentProviderDetailsEntity.cs new file mode 100644 index 0000000..b2bda24 --- /dev/null +++ b/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Entities/PaymentProviderDetailsEntity.cs @@ -0,0 +1,41 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Falcon.Common.Encryption; +using MAVN.Service.CustomerProfile.Domain.Models; + +namespace MAVN.Service.CustomerProfile.MsSqlRepositories.Entities +{ + [Table("payment_provider_details")] + public class PaymentProviderDetailsEntity : IPaymentProviderDetails + { + [Key] + [Column("id")] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public Guid Id { get; set; } + + [Column("partner_id")] + [Required] + public Guid PartnerId { get; set; } + + [Column("payment_integration_provider")] + [Required] + public string PaymentIntegrationProvider { get; set; } + + [Column("payment_integration_properties")] + [Required] + [EncryptedProperty] + public string PaymentIntegrationProperties { get; set; } + + public static PaymentProviderDetailsEntity Create(IPaymentProviderDetails model) + { + return new PaymentProviderDetailsEntity + { + PartnerId = model.PartnerId, + Id = model.Id, + PaymentIntegrationProperties = model.PaymentIntegrationProperties, + PaymentIntegrationProvider = model.PaymentIntegrationProvider, + }; + } + } +} diff --git a/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Migrations/20200428084047_AddPaymentProviderDetails.Designer.cs b/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Migrations/20200428084047_AddPaymentProviderDetails.Designer.cs new file mode 100644 index 0000000..bd45648 --- /dev/null +++ b/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Migrations/20200428084047_AddPaymentProviderDetails.Designer.cs @@ -0,0 +1,496 @@ +// +using System; +using MAVN.Service.CustomerProfile.MsSqlRepositories; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace MAVN.Service.CustomerProfile.MsSqlRepositories.Migrations +{ + [DbContext(typeof(CustomerProfileContext))] + [Migration("20200428084047_AddPaymentProviderDetails")] + partial class AddPaymentProviderDetails + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("customer_profile") + .HasAnnotation("ProductVersion", "2.2.4-servicing-10062") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.AdminProfileArchiveEntity", b => + { + b.Property("AdminId") + .ValueGeneratedOnAdd() + .HasColumnName("admin_id"); + + b.Property("Company") + .IsRequired() + .HasColumnName("company"); + + b.Property("Department") + .IsRequired() + .HasColumnName("department"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FirstName") + .IsRequired() + .HasColumnName("first_name"); + + b.Property("IsEmailVerified") + .HasColumnName("email_verified"); + + b.Property("JobTitle") + .IsRequired() + .HasColumnName("job_title"); + + b.Property("LastName") + .IsRequired() + .HasColumnName("last_name"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnName("phone_number"); + + b.Property("WasEmailEverVerified") + .HasColumnName("was_email_ever_verified"); + + b.HasKey("AdminId"); + + b.ToTable("admin_profiles_archive"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.AdminProfileEntity", b => + { + b.Property("AdminId") + .ValueGeneratedOnAdd() + .HasColumnName("admin_id"); + + b.Property("Company") + .IsRequired() + .HasColumnName("company"); + + b.Property("Department") + .IsRequired() + .HasColumnName("department"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FirstName") + .IsRequired() + .HasColumnName("first_name"); + + b.Property("IsEmailVerified") + .HasColumnName("email_verified"); + + b.Property("JobTitle") + .IsRequired() + .HasColumnName("job_title"); + + b.Property("LastName") + .IsRequired() + .HasColumnName("last_name"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnName("phone_number"); + + b.Property("WasEmailEverVerified") + .HasColumnName("was_email_ever_verified"); + + b.HasKey("AdminId"); + + b.HasIndex("Email"); + + b.ToTable("admin_profiles"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.CustomerProfileArchiveEntity", b => + { + b.Property("CustomerId") + .ValueGeneratedOnAdd() + .HasColumnName("customer_id"); + + b.Property("CountryOfNationalityId") + .HasColumnName("country_of_nationality_id"); + + b.Property("CountryOfResidenceId") + .HasColumnName("country_of_residence_id"); + + b.Property("CountryPhoneCodeId") + .HasColumnName("country_phone_code_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FirstName") + .HasColumnName("first_name"); + + b.Property("IsEmailVerified") + .HasColumnName("email_verified"); + + b.Property("IsPhoneVerified") + .HasColumnName("phone_verified"); + + b.Property("LastName") + .HasColumnName("last_name"); + + b.Property("PhoneNumber") + .HasColumnName("phone_number"); + + b.Property("Registered") + .HasColumnName("registered_at"); + + b.Property("ShortPhoneNumber") + .HasColumnName("short_phone_number"); + + b.Property("TierId") + .HasColumnName("tier_id"); + + b.Property("WasPhoneEverVerified") + .HasColumnName("was_phone_ever_verified"); + + b.HasKey("CustomerId"); + + b.HasIndex("Email"); + + b.ToTable("customer_profile_archive"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.CustomerProfileEntity", b => + { + b.Property("CustomerId") + .ValueGeneratedOnAdd() + .HasColumnName("customer_id"); + + b.Property("CountryOfNationalityId") + .HasColumnName("country_of_nationality_id"); + + b.Property("CountryOfResidenceId") + .HasColumnName("country_of_residence_id"); + + b.Property("CountryPhoneCodeId") + .HasColumnName("country_phone_code_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FirstName") + .HasColumnName("first_name"); + + b.Property("IsEmailVerified") + .HasColumnName("email_verified"); + + b.Property("IsPhoneVerified") + .HasColumnName("phone_verified"); + + b.Property("LastName") + .HasColumnName("last_name"); + + b.Property("LowerCasedEmail") + .IsRequired() + .HasColumnName("lower_cased_email"); + + b.Property("PhoneNumber") + .HasColumnName("phone_number"); + + b.Property("Registered") + .HasColumnName("registered_at"); + + b.Property("ShortPhoneNumber") + .HasColumnName("short_phone_number"); + + b.Property("Status") + .IsRequired(); + + b.Property("TierId") + .HasColumnName("tier_id"); + + b.Property("WasEmailEverVerified") + .HasColumnName("was_email_ever_verified"); + + b.Property("WasPhoneEverVerified") + .HasColumnName("was_phone_ever_verified"); + + b.HasKey("CustomerId"); + + b.HasIndex("Email") + .IsUnique(); + + b.HasIndex("LowerCasedEmail") + .IsUnique(); + + b.HasIndex("Status"); + + b.ToTable("customer_profile"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.LoginProviderEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnName("id") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CustomerId") + .IsRequired() + .HasColumnName("customer_id"); + + b.Property("LoginProvider") + .HasColumnName("login_provider"); + + b.HasKey("Id"); + + b.HasIndex("CustomerId"); + + b.ToTable("login_providers"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.PartnerContactArchiveEntity", b => + { + b.Property("LocationId") + .ValueGeneratedOnAdd() + .HasColumnName("location_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FirstName") + .HasColumnName("first_name"); + + b.Property("LastName") + .HasColumnName("last_name"); + + b.Property("PhoneNumber") + .HasColumnName("phone_number"); + + b.HasKey("LocationId"); + + b.ToTable("partner_contact_archive"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.PartnerContactEntity", b => + { + b.Property("LocationId") + .ValueGeneratedOnAdd() + .HasColumnName("location_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FirstName") + .HasColumnName("first_name"); + + b.Property("LastName") + .HasColumnName("last_name"); + + b.Property("PhoneNumber") + .HasColumnName("phone_number"); + + b.HasKey("LocationId"); + + b.HasIndex("Email"); + + b.HasIndex("PhoneNumber"); + + b.ToTable("partner_contact"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.PaymentProviderDetailsEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnName("id"); + + b.Property("PartnerId") + .HasColumnName("partner_id"); + + b.Property("PaymentIntegrationProperties") + .IsRequired() + .HasColumnName("payment_integration_properties"); + + b.Property("PaymentIntegrationProvider") + .IsRequired() + .HasColumnName("payment_integration_provider"); + + b.HasKey("Id"); + + b.ToTable("payment_provider_details"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.ReferralFriendProfileArchiveEntity", b => + { + b.Property("ReferralFriendId") + .ValueGeneratedOnAdd() + .HasColumnName("referral_friend_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FullName") + .IsRequired() + .HasColumnName("full_name"); + + b.Property("ReferrerId") + .HasColumnName("referrer_id"); + + b.HasKey("ReferralFriendId"); + + b.ToTable("referral_friend_profiles_archive"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.ReferralFriendProfileEntity", b => + { + b.Property("ReferralFriendId") + .ValueGeneratedOnAdd() + .HasColumnName("referral_friend_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FullName") + .IsRequired() + .HasColumnName("full_name"); + + b.Property("ReferrerId") + .HasColumnName("referrer_id"); + + b.HasKey("ReferralFriendId"); + + b.HasIndex("Email"); + + b.HasIndex("ReferrerId"); + + b.ToTable("referral_friend_profiles"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.ReferralHotelProfileArchiveEntity", b => + { + b.Property("ReferralHotelId") + .ValueGeneratedOnAdd() + .HasColumnName("referral_hotel_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.HasKey("ReferralHotelId"); + + b.ToTable("referral_hotel_profiles_archive"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.ReferralHotelProfileEntity", b => + { + b.Property("ReferralHotelId") + .ValueGeneratedOnAdd() + .HasColumnName("referral_hotel_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("Name") + .IsRequired() + .HasColumnName("name"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnName("phone_number"); + + b.HasKey("ReferralHotelId"); + + b.HasIndex("Email"); + + b.ToTable("referral_hotel_profiles"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.ReferralLeadProfileArchiveEntity", b => + { + b.Property("ReferralLeadId") + .ValueGeneratedOnAdd() + .HasColumnName("referral_lead_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FirstName") + .IsRequired() + .HasColumnName("first_name"); + + b.Property("LastName") + .IsRequired() + .HasColumnName("last_name"); + + b.Property("Note") + .HasColumnName("note"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnName("phone_number"); + + b.HasKey("ReferralLeadId"); + + b.ToTable("referral_lead_profiles_archive"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.ReferralLeadProfileEntity", b => + { + b.Property("ReferralLeadId") + .ValueGeneratedOnAdd() + .HasColumnName("referral_lead_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FirstName") + .IsRequired() + .HasColumnName("first_name"); + + b.Property("LastName") + .IsRequired() + .HasColumnName("last_name"); + + b.Property("Note") + .HasColumnName("note"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnName("phone_number"); + + b.HasKey("ReferralLeadId"); + + b.HasIndex("Email"); + + b.HasIndex("PhoneNumber"); + + b.ToTable("referral_lead_profiles"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.LoginProviderEntity", b => + { + b.HasOne("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.CustomerProfileEntity", "CustomerProfile") + .WithMany("LoginProviders") + .HasForeignKey("CustomerId") + .OnDelete(DeleteBehavior.Cascade); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Migrations/20200428084047_AddPaymentProviderDetails.cs b/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Migrations/20200428084047_AddPaymentProviderDetails.cs new file mode 100644 index 0000000..b66ecd0 --- /dev/null +++ b/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Migrations/20200428084047_AddPaymentProviderDetails.cs @@ -0,0 +1,33 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace MAVN.Service.CustomerProfile.MsSqlRepositories.Migrations +{ + public partial class AddPaymentProviderDetails : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "payment_provider_details", + schema: "customer_profile", + columns: table => new + { + id = table.Column(nullable: false, defaultValueSql: "newid()"), + partner_id = table.Column(nullable: false), + payment_integration_provider = table.Column(nullable: false), + payment_integration_properties = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_payment_provider_details", x => x.id); + }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "payment_provider_details", + schema: "customer_profile"); + } + } +} diff --git a/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Migrations/20200428091101_AddIndicesForPaymentProviderDetails.Designer.cs b/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Migrations/20200428091101_AddIndicesForPaymentProviderDetails.Designer.cs new file mode 100644 index 0000000..32dba70 --- /dev/null +++ b/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Migrations/20200428091101_AddIndicesForPaymentProviderDetails.Designer.cs @@ -0,0 +1,501 @@ +// +using System; +using MAVN.Service.CustomerProfile.MsSqlRepositories; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace MAVN.Service.CustomerProfile.MsSqlRepositories.Migrations +{ + [DbContext(typeof(CustomerProfileContext))] + [Migration("20200428091101_AddIndicesForPaymentProviderDetails")] + partial class AddIndicesForPaymentProviderDetails + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasDefaultSchema("customer_profile") + .HasAnnotation("ProductVersion", "2.2.4-servicing-10062") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.AdminProfileArchiveEntity", b => + { + b.Property("AdminId") + .ValueGeneratedOnAdd() + .HasColumnName("admin_id"); + + b.Property("Company") + .IsRequired() + .HasColumnName("company"); + + b.Property("Department") + .IsRequired() + .HasColumnName("department"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FirstName") + .IsRequired() + .HasColumnName("first_name"); + + b.Property("IsEmailVerified") + .HasColumnName("email_verified"); + + b.Property("JobTitle") + .IsRequired() + .HasColumnName("job_title"); + + b.Property("LastName") + .IsRequired() + .HasColumnName("last_name"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnName("phone_number"); + + b.Property("WasEmailEverVerified") + .HasColumnName("was_email_ever_verified"); + + b.HasKey("AdminId"); + + b.ToTable("admin_profiles_archive"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.AdminProfileEntity", b => + { + b.Property("AdminId") + .ValueGeneratedOnAdd() + .HasColumnName("admin_id"); + + b.Property("Company") + .IsRequired() + .HasColumnName("company"); + + b.Property("Department") + .IsRequired() + .HasColumnName("department"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FirstName") + .IsRequired() + .HasColumnName("first_name"); + + b.Property("IsEmailVerified") + .HasColumnName("email_verified"); + + b.Property("JobTitle") + .IsRequired() + .HasColumnName("job_title"); + + b.Property("LastName") + .IsRequired() + .HasColumnName("last_name"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnName("phone_number"); + + b.Property("WasEmailEverVerified") + .HasColumnName("was_email_ever_verified"); + + b.HasKey("AdminId"); + + b.HasIndex("Email"); + + b.ToTable("admin_profiles"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.CustomerProfileArchiveEntity", b => + { + b.Property("CustomerId") + .ValueGeneratedOnAdd() + .HasColumnName("customer_id"); + + b.Property("CountryOfNationalityId") + .HasColumnName("country_of_nationality_id"); + + b.Property("CountryOfResidenceId") + .HasColumnName("country_of_residence_id"); + + b.Property("CountryPhoneCodeId") + .HasColumnName("country_phone_code_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FirstName") + .HasColumnName("first_name"); + + b.Property("IsEmailVerified") + .HasColumnName("email_verified"); + + b.Property("IsPhoneVerified") + .HasColumnName("phone_verified"); + + b.Property("LastName") + .HasColumnName("last_name"); + + b.Property("PhoneNumber") + .HasColumnName("phone_number"); + + b.Property("Registered") + .HasColumnName("registered_at"); + + b.Property("ShortPhoneNumber") + .HasColumnName("short_phone_number"); + + b.Property("TierId") + .HasColumnName("tier_id"); + + b.Property("WasPhoneEverVerified") + .HasColumnName("was_phone_ever_verified"); + + b.HasKey("CustomerId"); + + b.HasIndex("Email"); + + b.ToTable("customer_profile_archive"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.CustomerProfileEntity", b => + { + b.Property("CustomerId") + .ValueGeneratedOnAdd() + .HasColumnName("customer_id"); + + b.Property("CountryOfNationalityId") + .HasColumnName("country_of_nationality_id"); + + b.Property("CountryOfResidenceId") + .HasColumnName("country_of_residence_id"); + + b.Property("CountryPhoneCodeId") + .HasColumnName("country_phone_code_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FirstName") + .HasColumnName("first_name"); + + b.Property("IsEmailVerified") + .HasColumnName("email_verified"); + + b.Property("IsPhoneVerified") + .HasColumnName("phone_verified"); + + b.Property("LastName") + .HasColumnName("last_name"); + + b.Property("LowerCasedEmail") + .IsRequired() + .HasColumnName("lower_cased_email"); + + b.Property("PhoneNumber") + .HasColumnName("phone_number"); + + b.Property("Registered") + .HasColumnName("registered_at"); + + b.Property("ShortPhoneNumber") + .HasColumnName("short_phone_number"); + + b.Property("Status") + .IsRequired(); + + b.Property("TierId") + .HasColumnName("tier_id"); + + b.Property("WasEmailEverVerified") + .HasColumnName("was_email_ever_verified"); + + b.Property("WasPhoneEverVerified") + .HasColumnName("was_phone_ever_verified"); + + b.HasKey("CustomerId"); + + b.HasIndex("Email") + .IsUnique(); + + b.HasIndex("LowerCasedEmail") + .IsUnique(); + + b.HasIndex("Status"); + + b.ToTable("customer_profile"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.LoginProviderEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnName("id") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CustomerId") + .IsRequired() + .HasColumnName("customer_id"); + + b.Property("LoginProvider") + .HasColumnName("login_provider"); + + b.HasKey("Id"); + + b.HasIndex("CustomerId"); + + b.ToTable("login_providers"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.PartnerContactArchiveEntity", b => + { + b.Property("LocationId") + .ValueGeneratedOnAdd() + .HasColumnName("location_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FirstName") + .HasColumnName("first_name"); + + b.Property("LastName") + .HasColumnName("last_name"); + + b.Property("PhoneNumber") + .HasColumnName("phone_number"); + + b.HasKey("LocationId"); + + b.ToTable("partner_contact_archive"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.PartnerContactEntity", b => + { + b.Property("LocationId") + .ValueGeneratedOnAdd() + .HasColumnName("location_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FirstName") + .HasColumnName("first_name"); + + b.Property("LastName") + .HasColumnName("last_name"); + + b.Property("PhoneNumber") + .HasColumnName("phone_number"); + + b.HasKey("LocationId"); + + b.HasIndex("Email"); + + b.HasIndex("PhoneNumber"); + + b.ToTable("partner_contact"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.PaymentProviderDetailsEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnName("id"); + + b.Property("PartnerId") + .HasColumnName("partner_id"); + + b.Property("PaymentIntegrationProperties") + .IsRequired() + .HasColumnName("payment_integration_properties"); + + b.Property("PaymentIntegrationProvider") + .IsRequired() + .HasColumnName("payment_integration_provider"); + + b.HasKey("Id"); + + b.HasIndex("PartnerId"); + + b.HasIndex("PartnerId", "PaymentIntegrationProvider") + .IsUnique(); + + b.ToTable("payment_provider_details"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.ReferralFriendProfileArchiveEntity", b => + { + b.Property("ReferralFriendId") + .ValueGeneratedOnAdd() + .HasColumnName("referral_friend_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FullName") + .IsRequired() + .HasColumnName("full_name"); + + b.Property("ReferrerId") + .HasColumnName("referrer_id"); + + b.HasKey("ReferralFriendId"); + + b.ToTable("referral_friend_profiles_archive"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.ReferralFriendProfileEntity", b => + { + b.Property("ReferralFriendId") + .ValueGeneratedOnAdd() + .HasColumnName("referral_friend_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FullName") + .IsRequired() + .HasColumnName("full_name"); + + b.Property("ReferrerId") + .HasColumnName("referrer_id"); + + b.HasKey("ReferralFriendId"); + + b.HasIndex("Email"); + + b.HasIndex("ReferrerId"); + + b.ToTable("referral_friend_profiles"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.ReferralHotelProfileArchiveEntity", b => + { + b.Property("ReferralHotelId") + .ValueGeneratedOnAdd() + .HasColumnName("referral_hotel_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.HasKey("ReferralHotelId"); + + b.ToTable("referral_hotel_profiles_archive"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.ReferralHotelProfileEntity", b => + { + b.Property("ReferralHotelId") + .ValueGeneratedOnAdd() + .HasColumnName("referral_hotel_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("Name") + .IsRequired() + .HasColumnName("name"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnName("phone_number"); + + b.HasKey("ReferralHotelId"); + + b.HasIndex("Email"); + + b.ToTable("referral_hotel_profiles"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.ReferralLeadProfileArchiveEntity", b => + { + b.Property("ReferralLeadId") + .ValueGeneratedOnAdd() + .HasColumnName("referral_lead_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FirstName") + .IsRequired() + .HasColumnName("first_name"); + + b.Property("LastName") + .IsRequired() + .HasColumnName("last_name"); + + b.Property("Note") + .HasColumnName("note"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnName("phone_number"); + + b.HasKey("ReferralLeadId"); + + b.ToTable("referral_lead_profiles_archive"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.ReferralLeadProfileEntity", b => + { + b.Property("ReferralLeadId") + .ValueGeneratedOnAdd() + .HasColumnName("referral_lead_id"); + + b.Property("Email") + .IsRequired() + .HasColumnName("email"); + + b.Property("FirstName") + .IsRequired() + .HasColumnName("first_name"); + + b.Property("LastName") + .IsRequired() + .HasColumnName("last_name"); + + b.Property("Note") + .HasColumnName("note"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnName("phone_number"); + + b.HasKey("ReferralLeadId"); + + b.HasIndex("Email"); + + b.HasIndex("PhoneNumber"); + + b.ToTable("referral_lead_profiles"); + }); + + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.LoginProviderEntity", b => + { + b.HasOne("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.CustomerProfileEntity", "CustomerProfile") + .WithMany("LoginProviders") + .HasForeignKey("CustomerId") + .OnDelete(DeleteBehavior.Cascade); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Migrations/20200428091101_AddIndicesForPaymentProviderDetails.cs b/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Migrations/20200428091101_AddIndicesForPaymentProviderDetails.cs new file mode 100644 index 0000000..6521113 --- /dev/null +++ b/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Migrations/20200428091101_AddIndicesForPaymentProviderDetails.cs @@ -0,0 +1,50 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace MAVN.Service.CustomerProfile.MsSqlRepositories.Migrations +{ + public partial class AddIndicesForPaymentProviderDetails : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "payment_integration_provider", + schema: "customer_profile", + table: "payment_provider_details", + nullable: false, + oldClrType: typeof(string)); + + migrationBuilder.CreateIndex( + name: "IX_payment_provider_details_partner_id", + schema: "customer_profile", + table: "payment_provider_details", + column: "partner_id"); + + migrationBuilder.CreateIndex( + name: "IX_payment_provider_details_partner_id_payment_integration_provider", + schema: "customer_profile", + table: "payment_provider_details", + columns: new[] { "partner_id", "payment_integration_provider" }, + unique: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropIndex( + name: "IX_payment_provider_details_partner_id", + schema: "customer_profile", + table: "payment_provider_details"); + + migrationBuilder.DropIndex( + name: "IX_payment_provider_details_partner_id_payment_integration_provider", + schema: "customer_profile", + table: "payment_provider_details"); + + migrationBuilder.AlterColumn( + name: "payment_integration_provider", + schema: "customer_profile", + table: "payment_provider_details", + nullable: false, + oldClrType: typeof(string)); + } + } +} diff --git a/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Migrations/CustomerProfileContextModelSnapshot.cs b/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Migrations/CustomerProfileContextModelSnapshot.cs index 8c88cfa..8563385 100644 --- a/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Migrations/CustomerProfileContextModelSnapshot.cs +++ b/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Migrations/CustomerProfileContextModelSnapshot.cs @@ -307,6 +307,33 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("partner_contact"); }); + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.PaymentProviderDetailsEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnName("id"); + + b.Property("PartnerId") + .HasColumnName("partner_id"); + + b.Property("PaymentIntegrationProperties") + .IsRequired() + .HasColumnName("payment_integration_properties"); + + b.Property("PaymentIntegrationProvider") + .IsRequired() + .HasColumnName("payment_integration_provider"); + + b.HasKey("Id"); + + b.HasIndex("PartnerId"); + + b.HasIndex("PartnerId", "PaymentIntegrationProvider") + .IsUnique(); + + b.ToTable("payment_provider_details"); + }); + modelBuilder.Entity("MAVN.Service.CustomerProfile.MsSqlRepositories.Entities.ReferralFriendProfileArchiveEntity", b => { b.Property("ReferralFriendId") diff --git a/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Repositories/PaymentProviderDetailsRepository.cs b/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Repositories/PaymentProviderDetailsRepository.cs new file mode 100644 index 0000000..305f07b --- /dev/null +++ b/src/MAVN.Service.CustomerProfile.MsSqlRepositories/Repositories/PaymentProviderDetailsRepository.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Falcon.Common.Encryption; +using Lykke.Common.MsSql; +using MAVN.Service.CustomerProfile.Domain.Models; +using MAVN.Service.CustomerProfile.Domain.Repositories; +using MAVN.Service.CustomerProfile.MsSqlRepositories.Entities; +using Microsoft.EntityFrameworkCore; + +namespace MAVN.Service.CustomerProfile.MsSqlRepositories.Repositories +{ + public class PaymentProviderDetailsRepository : IPaymentProviderDetailsRepository + { + private readonly MsSqlContextFactory _contextFactory; + private readonly IEncryptionService _encryptionService; + + public PaymentProviderDetailsRepository(MsSqlContextFactory contextFactory, IEncryptionService encryptionService) + { + _contextFactory = contextFactory; + _encryptionService = encryptionService; + } + + public async Task CreateAsync(IPaymentProviderDetails model) + { + using (var context = _contextFactory.CreateDataContext()) + { + var entity = PaymentProviderDetailsEntity.Create(model); + entity = _encryptionService.Encrypt(entity); + + context.PaymentProviderDetails.Add(entity); + + await context.SaveChangesAsync(); + } + } + + public async Task UpdateAsync(IPaymentProviderDetails model) + { + using (var context = _contextFactory.CreateDataContext()) + { + var existingEntity = await context.PaymentProviderDetails.FindAsync(model.Id); + + if (existingEntity == null) + return false; + + existingEntity = _encryptionService.Decrypt(existingEntity); + + existingEntity.PaymentIntegrationProperties = model.PaymentIntegrationProperties; + existingEntity.PaymentIntegrationProvider = model.PaymentIntegrationProvider; + + existingEntity = _encryptionService.Encrypt(existingEntity); + + context.PaymentProviderDetails.Update(existingEntity); + + await context.SaveChangesAsync(); + return true; + } + } + + public async Task DeleteAsync(Guid id) + { + using (var context = _contextFactory.CreateDataContext()) + { + var entity = await context.PaymentProviderDetails.FindAsync(id); + + if (entity == null) + return false; + + context.PaymentProviderDetails.Remove(entity); + return await context.SaveChangesAsync() > 0; + } + } + + public async Task> GetListByPartnerIdAsync(Guid partnerId) + { + using (var context = _contextFactory.CreateDataContext()) + { + var result = await context.PaymentProviderDetails + .Where(p => p.PartnerId == partnerId) + .Select(p => _encryptionService.Decrypt(p)) + .ToListAsync(); + + return result; + } + } + + public async Task GetByPartnerIdAndProviderAsync(Guid partnerId, + string paymentProvider) + { + using (var context = _contextFactory.CreateDataContext()) + { + var result = await context.PaymentProviderDetails + .FirstOrDefaultAsync(p => + p.PartnerId == partnerId && p.PaymentIntegrationProvider == paymentProvider); + + if (result != null) + result = _encryptionService.Decrypt(result); + + return result; + } + } + } +} diff --git a/src/MAVN.Service.CustomerProfile/Controllers/PaymentProviderDetailsController.cs b/src/MAVN.Service.CustomerProfile/Controllers/PaymentProviderDetailsController.cs new file mode 100644 index 0000000..c44fe43 --- /dev/null +++ b/src/MAVN.Service.CustomerProfile/Controllers/PaymentProviderDetailsController.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Net; +using System.Threading.Tasks; +using AutoMapper; +using MAVN.Service.CustomerProfile.Client.Api; +using MAVN.Service.CustomerProfile.Client.Models.Enums; +using MAVN.Service.CustomerProfile.Client.Models.Requests; +using MAVN.Service.CustomerProfile.Client.Models.Responses; +using MAVN.Service.CustomerProfile.Domain.Models; +using MAVN.Service.CustomerProfile.Domain.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace MAVN.Service.CustomerProfile.Controllers +{ + [Authorize] + [ApiController] + [Route("api/paymentProviderDetails")] + public class PaymentProviderDetailsController : ControllerBase, IPaymentProviderDetailsApi + { + private readonly IPaymentProviderDetailsService _paymentProviderDetailsService; + private readonly IMapper _mapper; + + public PaymentProviderDetailsController(IPaymentProviderDetailsService paymentProviderDetailsService, IMapper mapper) + { + _paymentProviderDetailsService = paymentProviderDetailsService; + _mapper = mapper; + } + + /// + /// Creates payment provider details + /// + /// + [HttpPost] + [ProducesResponseType(typeof(PaymentProviderDetailsErrorCodes), (int)HttpStatusCode.OK)] + public async Task CreateAsync(CreatePaymentProviderDetailsRequest request) + { + var model = _mapper.Map(request); + var result = await _paymentProviderDetailsService.CreateAsync(model); + + return (PaymentProviderDetailsErrorCodes)result; + } + + /// + /// Updates payment provider details + /// + /// + [HttpPut] + [ProducesResponseType(typeof(PaymentProviderDetailsErrorCodes), (int)HttpStatusCode.OK)] + public async Task UpdateAsync(EditPaymentProviderDetailsRequest request) + { + var model = _mapper.Map(request); + var result = await _paymentProviderDetailsService.UpdateAsync(model); + + return (PaymentProviderDetailsErrorCodes)result; + } + + /// + /// Deletes payment provider details + /// + /// + [HttpDelete("{id}")] + [ProducesResponseType(typeof(PaymentProviderDetailsErrorCodes), (int)HttpStatusCode.OK)] + public async Task DeleteAsync([FromRoute]Guid id) + { + var result = await _paymentProviderDetailsService.DeleteAsync(id); + + return (PaymentProviderDetailsErrorCodes)result; + } + + /// + /// Returns all payment provider details for specific partner + /// + /// + [HttpGet("{partnerId}")] + [ProducesResponseType(typeof(IReadOnlyList), (int)HttpStatusCode.OK)] + public async Task> GetListByPartnerIdAsync([FromRoute]Guid partnerId) + { + var result = await _paymentProviderDetailsService.GetListByPartnerIdAsync(partnerId); + + return _mapper.Map>(result); + } + + /// + /// Returns all payment provider details for specific partner + /// + /// + [HttpGet] + [ProducesResponseType(typeof(GetByPartnerIdAndPaymentProviderResponse), (int)HttpStatusCode.OK)] + public async Task GetByPartnerIdAndPaymentProviderAsync([Required]Guid partnerId, [Required] string paymentProvider) + { + var result = await _paymentProviderDetailsService.GetByPartnerIdAndPaymentProviderAsync(partnerId, paymentProvider); + + if (result == null) + return new GetByPartnerIdAndPaymentProviderResponse + { + ErrorCode = PaymentProviderDetailsErrorCodes.PaymentProviderDetailsDoesNotExist + }; + + return new GetByPartnerIdAndPaymentProviderResponse + { + PaymentProviderDetails = _mapper.Map(result), + ErrorCode = PaymentProviderDetailsErrorCodes.None + }; + } + } +} diff --git a/src/MAVN.Service.CustomerProfile/MappingProfiles/AutoMapperProfile.cs b/src/MAVN.Service.CustomerProfile/MappingProfiles/AutoMapperProfile.cs index 1887e8e..06e81e3 100644 --- a/src/MAVN.Service.CustomerProfile/MappingProfiles/AutoMapperProfile.cs +++ b/src/MAVN.Service.CustomerProfile/MappingProfiles/AutoMapperProfile.cs @@ -65,6 +65,11 @@ public AutoMapperProfile() CreateMap(); CreateMap(); + + CreateMap() + .ForMember(x => x.Id, opt => opt.Ignore()); + CreateMap(); + CreateMap(); } } } diff --git a/src/MAVN.Service.CustomerProfile/Modules/DataLayerModule.cs b/src/MAVN.Service.CustomerProfile/Modules/DataLayerModule.cs index 1d4a90f..b59cb2f 100644 --- a/src/MAVN.Service.CustomerProfile/Modules/DataLayerModule.cs +++ b/src/MAVN.Service.CustomerProfile/Modules/DataLayerModule.cs @@ -51,6 +51,10 @@ protected override void Load(ContainerBuilder builder) builder.RegisterType() .As() .SingleInstance(); + + builder.RegisterType() + .As() + .SingleInstance(); } } } diff --git a/src/MAVN.Service.CustomerProfile/Modules/ServiceModule.cs b/src/MAVN.Service.CustomerProfile/Modules/ServiceModule.cs index c1e04fe..734a618 100644 --- a/src/MAVN.Service.CustomerProfile/Modules/ServiceModule.cs +++ b/src/MAVN.Service.CustomerProfile/Modules/ServiceModule.cs @@ -1,4 +1,4 @@ -using System; +using System; using Autofac; using Falcon.Common.Encryption; using JetBrains.Annotations; @@ -61,6 +61,10 @@ protected override void Load(ContainerBuilder builder) .As() .SingleInstance(); + builder.RegisterType() + .As() + .SingleInstance(); + var apiKeysPairs = Environment.GetEnvironmentVariable("CPApiKeysPairs"); builder.RegisterType() .As()