iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0

昨天我們實作了售票的 API ,並把購票資訊推送給 Pub/Sub 的 Topic 再由 Scbscription 推送給 Process,但 Process 並沒有將這筆資料寫入 DB 進行資料的持久化,今天就開始來時做這個部分。

建 Table

先前規劃的 Schema 中並沒有購票資料相關的 Table 因此要先建立一個,寫一個新的 Model Data/Model/TIcket.cs 來讓 ORM 框架進行 Migration

using System.ComponentModel.DataAnnotations.Schema;

namespace iThome2024.ProcessService.Data.Model;

public class Ticket
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public int SeatId { get; set; }
    public int UserId { get; set; }
    [Column(TypeName = "timestamp")]
    public DateTime CreateTime { get; set; }
    public Seat Seat { get; set; }
    public User User { get; set; }
}

更新 DbContext 加入對 Ticket 表的使用

public class TicketSalesContext : DbContext
{
    public DbSet<User> User { get; set; }
    public DbSet<Event> Event { get; set; }
    public DbSet<Seat> Seat { get; set; }
    public DbSet<Ticket> Ticket { get; set; }

    public TicketSalesContext(DbContextOptions<TicketSalesContext> options) : base(options)
    {
    }
}

執行 Migration

dotnet ef migrations add CreateTableTicket
dotnet ef database update

確認一下 DB 是否確實有產出 Table
https://ithelp.ithome.com.tw/upload/images/20240927/20168312PB2rpk9jyh.png

調整 API

為了處理接收進來的 Message 可以從 SalesService 把 TicketViewModel Copy 一份過來,記得 namespace 要改過

namespace iThome2024.ProcessService.ViewModel;

public class TicketViewModel
{
    public int EventId { get; set; }
    public int SeatId { get; set; }
    public string? Username { get; set; }
    public DateTime CreateTime { get; set; }
}

接著更新 PubSub Push 的 Endpoint,把 Json 格式的 Message 轉換成 TickerViewModel 再寫入 DB

app.MapPost("/Test/SubEndpoint", async (PubSubMessage pubSubMessage,
        [FromServices] TicketSalesContext context) =>
{
    string utf8String = Base64Converter.Base64ToUtf8(pubSubMessage.Message?.Data ?? "");
    var ticketViewModel = JsonSerializer.Deserialize<TicketViewModel>(utf8String);
    if (ticketViewModel == null)
    {
        return Results.BadRequest();
    }
    await context.Ticket.AddAsync(new Ticket
    {
        SeatId = ticketViewModel.SeatId,
        UserId = context.User.First().Id,
        CreateTime = ticketViewModel.CreateTime
    });
    await context.SaveChangesAsync();
    return Results.Ok();
})

測試

接下來進行測試,我們對 Sales Service 送出一個購票的請求

https://ithelp.ithome.com.tw/upload/images/20240927/20168312OqlW9eDFT2.png
確認 DB 有成功寫入

https://ithelp.ithome.com.tw/upload/images/20240927/20168312Qdv7jCQMhr.png
OK 這樣就完成了整個購票流程的資料串接。


上一篇
Day25: 實作-開發-售票
下一篇
Day27: 實作-壓力測試-K6
系列文
窮小子的售票系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言