summaryrefslogtreecommitdiff
path: root/slips/src/app/Marina/DataAccess/DataMappers/RegistrationDataMapper.cs
diff options
context:
space:
mode:
Diffstat (limited to 'slips/src/app/Marina/DataAccess/DataMappers/RegistrationDataMapper.cs')
-rw-r--r--slips/src/app/Marina/DataAccess/DataMappers/RegistrationDataMapper.cs88
1 files changed, 88 insertions, 0 deletions
diff --git a/slips/src/app/Marina/DataAccess/DataMappers/RegistrationDataMapper.cs b/slips/src/app/Marina/DataAccess/DataMappers/RegistrationDataMapper.cs
new file mode 100644
index 0000000..5c2cd41
--- /dev/null
+++ b/slips/src/app/Marina/DataAccess/DataMappers/RegistrationDataMapper.cs
@@ -0,0 +1,88 @@
+using Marina.DataAccess.Builders;
+using Marina.DataAccess.Schemas;
+using Marina.Domain;
+using Marina.Domain.Interfaces;
+using Marina.Infrastructure.Container;
+
+namespace Marina.DataAccess.DataMappers {
+ public class RegistrationDataMapper : IRegistrationDataMapper {
+ public RegistrationDataMapper() : this( Resolve.DependencyFor< IDatabaseGateway >( ) ) {}
+
+ public RegistrationDataMapper( IDatabaseGateway gateway ) {
+ _gateway = gateway;
+ }
+
+ public IRegistration For( long customerId ) {
+ return Mappers.From( _gateway.LoadRowUsing( Queries.SelectRegistrationFor( customerId ) ) );
+ }
+
+ public void Insert( IRegistration registration, long forCustomerId ) {
+ using ( IDatabaseTransaction unitOfWork = new DatabaseTransaction( ) ) {
+ _gateway.Execute( Queries.Insert( registration, forCustomerId ),
+ Queries.UpdateCustomer( registration, forCustomerId ) );
+ unitOfWork.Commit( );
+ }
+ }
+
+ public void Update( IRegistration registration, long forCustomerId ) {
+ using ( IDatabaseTransaction unitOfWork = new DatabaseTransaction( ) ) {
+ _gateway.Execute( Queries.UpdateCustomer( registration, forCustomerId ),
+ Queries.UpdateAuthorization( registration, forCustomerId ) );
+ unitOfWork.Commit( );
+ }
+ }
+
+ private readonly IDatabaseGateway _gateway;
+
+ private class Queries {
+ public static IQuery SelectRegistrationFor( long customerId ) {
+ return DatabaseSelect.From( CustomerTable.TableName )
+ .AddColumn( CustomerTable.FirstName )
+ .AddColumn( CustomerTable.LastName )
+ .AddColumn( CustomerTable.Phone )
+ .AddColumn( CustomerTable.City )
+ .AddColumn( AuthorizationTable.UserName )
+ .AddColumn( AuthorizationTable.Password )
+ .InnerJoinOn( AuthorizationTable.CustomerID, CustomerTable.CustomerID )
+ .Where( CustomerTable.CustomerID, customerId.ToString( ) ).Build( );
+ }
+
+ public static IQuery Insert( IRegistration registration, long forCustomerId ) {
+ return DatabaseInsert.Into( AuthorizationTable.TableName )
+ .AddValue( AuthorizationTable.CustomerID, forCustomerId.ToString( ) )
+ .AddValue( AuthorizationTable.UserName, registration.Username( ) )
+ .AddValue( AuthorizationTable.Password, registration.Password( ) )
+ .Build( );
+ }
+
+ public static IQuery UpdateCustomer( IRegistration registration, long forCustomerId ) {
+ return DatabaseUpdate.Where( CustomerTable.CustomerID, forCustomerId )
+ .Add( CustomerTable.FirstName, registration.FirstName( ) )
+ .Add( CustomerTable.LastName, registration.LastName( ) )
+ .Add( CustomerTable.Phone, registration.PhoneNumber( ) )
+ .Add( CustomerTable.City, registration.City( ) )
+ .Build( );
+ }
+
+ public static IQuery UpdateAuthorization( IRegistration registration, long forCustomerId ) {
+ return DatabaseUpdate.Where( AuthorizationTable.CustomerID, forCustomerId )
+ .Add( AuthorizationTable.UserName, registration.Username( ) )
+ .Add( AuthorizationTable.Password, registration.Password( ) )
+ .Build( );
+ }
+ }
+
+ private class Mappers {
+ public static IRegistration From( IDatabaseRow row ) {
+ return new CustomerRegistration(
+ row.From< string >( AuthorizationTable.UserName ),
+ row.From< string >( AuthorizationTable.Password ),
+ row.From< string >( CustomerTable.FirstName ),
+ row.From< string >( CustomerTable.LastName ),
+ row.From< string >( CustomerTable.Phone ),
+ row.From< string >( CustomerTable.City )
+ );
+ }
+ }
+ }
+} \ No newline at end of file