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