Skip to content

Instantly share code, notes, and snippets.

@rommsen
Created February 25, 2020 09:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rommsen/bc3e9411efd3e66ffff4cf70475c422d to your computer and use it in GitHub Desktop.
Save rommsen/bc3e9411efd3e66ffff4cf70475c422d to your computer and use it in GitHub Desktop.
namespace ddd_patterns.Step6
{
public interface IPaymentService
{
public bool Pay(decimal amount, decimal vat);
}
}
using System;
namespace ddd_patterns.Step6
{
public interface ITicketRepository
{
public int HowManyAreAvailable();
public Guid Add(Guid attendee);
public void Remove(Guid tId);
void Payed(Guid ticket);
DateTime BookingDateFor(Guid ticket);
}
}
namespace ddd_patterns.Step6
{
public interface IVoucherService
{
public int DiscountFor(string voucher);
}
}
using System;
namespace ddd_patterns.Step6
{
public class OnlineTickets
{
private readonly ITicketRepository _tickets;
private readonly IVoucherService _vouchers;
private readonly IPaymentService _paymentService;
private readonly DateTime _earlyBirdFrom;
private readonly DateTime _earlyBirdUntil;
private readonly DateTime _blindBirdFrom;
private readonly DateTime _blindBirdUntil;
private readonly decimal _blindBirdPrice;
private readonly decimal _earlyBirdPrice;
private readonly decimal _normalBirdPrice;
public OnlineTickets(
ITicketRepository tickets,
IVoucherService vouchers,
IPaymentService paymentService,
DateTime earlyBirdFrom,
DateTime earlyBirdUntil,
DateTime blindBirdFrom,
DateTime blindBirdUntil,
decimal blindBirdPrice,
decimal earlyBirdPrice,
decimal normalBirdPrice)
{
_tickets = tickets;
_vouchers = vouchers;
_paymentService = paymentService;
_earlyBirdFrom = earlyBirdFrom;
_earlyBirdUntil = earlyBirdUntil;
_blindBirdFrom = blindBirdFrom;
_blindBirdUntil = blindBirdUntil;
_blindBirdPrice = blindBirdPrice;
_earlyBirdPrice = earlyBirdPrice;
_normalBirdPrice = normalBirdPrice;
}
public Guid BookFor(Guid attendee)
{
var availableTickets = _tickets.HowManyAreAvailable();
if (availableTickets <= 0)
{
throw new Exception("No Ticket available");
}
return _tickets.Add(attendee);
}
public void Cancel(Guid ticket)
{
_tickets.Remove(ticket);
}
public bool PayFor(Guid ticket, string voucher)
{
var bookingDate = _tickets.BookingDateFor(ticket);
var amount = _normalBirdPrice;
if (bookingDate >= _blindBirdFrom && bookingDate <= _blindBirdUntil)
{
amount = _blindBirdPrice;
}
else if (bookingDate >= _earlyBirdFrom && bookingDate <= _earlyBirdUntil)
{
amount = _earlyBirdPrice;
}
amount -= _vouchers.DiscountFor(voucher);
var vat = amount * 0.19m;
if (!_paymentService.Pay(amount, vat))
{
return false;
}
_tickets.Payed(ticket);
return true;
}
}
}
using System;
using System.Data.SqlClient;
namespace ddd_patterns.Step6
{
public class SqlTicketRepository : ITicketRepository
{
private readonly string _connectionString;
public SqlTicketRepository(string connectionString)
{
_connectionString = connectionString;
}
public int HowManyAreAvailable()
{
var availableTickets = 0;
const string sql1 = @"SELECT get number of available tickets from db";
using var connection = new SqlConnection(_connectionString);
var command = new SqlCommand(sql1, connection);
connection.Open();
var reader = command.ExecuteReader();
while (reader.Read())
{
availableTickets = reader.GetInt32(0);
}
reader.Close();
return availableTickets;
}
public Guid Add(Guid attendee)
{
using var connection = new SqlConnection(_connectionString);
var tId = Guid.NewGuid();
const string sql2 = @"Insert into tickets... tId = @tId, aId = @aId";
var command2 = new SqlCommand(sql2, connection);
command2.Parameters.AddWithValue("@tId", tId);
command2.Parameters.AddWithValue("@tad", attendee);
command2.ExecuteNonQuery();
return tId;
}
public void Remove(Guid tId)
{
using var connection = new SqlConnection(_connectionString);
const string sql = @"Delete FROM tickets WHERE tId = @tId";
var command = new SqlCommand(sql, connection);
command.Parameters.AddWithValue("@tId", tId);
command.ExecuteNonQuery();
}
public void Payed(Guid ticket)
{
throw new NotImplementedException();
}
public DateTime BookingDateFor(Guid ticket)
{
throw new NotImplementedException();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment