summaryrefslogtreecommitdiff
path: root/slips/src/app/Marina/DataAccess/DataMappers/RegistrationDataMapper.cs
blob: 5c2cd416f47112429169b3c3d86738e0adde2d55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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 )
					);
			}
		}
	}
}