estatedocflow / estatedocflow.api

0 stars 0 forks source link

Runner Assignment API #14

Open estatedocflow opened 1 month ago

estatedocflow commented 1 month ago

Description

Implement message queues and consumers to process runner responses asynchronously, sending confirmation emails upon acceptance of booking requests.

RabbitMQ Message Payloads:

Define message payloads for runner assignment and confirmation messages.

// Runner assignment message
{
  "bookingId": "123",
  "runnerId": "456",
  "proposedSlot": "2024-05-15 10:00 AM"
}

// Runner confirmation message
{
  "bookingId": "123",
  "confirmation": true
}
  1. Runner Assignment (Message Publisher):

When a booking request is received, publish a message to RabbitMQ containing the booking details (bookingId, runnerId, proposedSlot) for runner assignment.

  1. Runner Assignment (Message Consumer):

Implement a consumer to receive and process runner assignment messages. Runners can either accept the request (confirmation: true) or propose an alternative slot/runner (confirmation: false with proposed details).

  1. Confirmation Email Trigger:

Upon receiving an acceptance confirmation from a runner, trigger confirmation emails to the customer and runner.

Integration with RabbitMQ (Example)

// Publishing runner assignment message
public void PublishRunnerAssignmentMessage(string bookingId, string runnerId, string proposedSlot)
{
    var message = new
    {
        bookingId,
        runnerId,
        proposedSlot
    };
    var body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message));

    _channel.BasicPublish(exchange: "",
                          routingKey: "runnerAssignmentQueue",
                          basicProperties: null,
                          body: body);
}

// Consuming runner assignment messages
public void ConsumeRunnerAssignmentMessages()
{
    var consumer = new EventingBasicConsumer(_channel);
    consumer.Received += (model, ea) =>
    {
        var body = ea.Body.ToArray();
        var message = Encoding.UTF8.GetString(body);

        var assignmentMessage = JsonConvert.DeserializeObject<RunnerAssignmentMessage>(message);

        // Process runner assignment (acceptance or propose alternative)
        ProcessRunnerAssignment(assignmentMessage);

        _channel.BasicAck(ea.DeliveryTag, false);
    };

    _channel.BasicConsume(queue: "runnerAssignmentQueue",
                          autoAck: false,
                          consumer: consumer);
}

Additional Notes