session.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package session
  2. import (
  3. "context"
  4. "github.com/google/uuid"
  5. "github.com/kujtimiihoxha/termai/internal/db"
  6. "github.com/kujtimiihoxha/termai/internal/pubsub"
  7. )
  8. type Session struct {
  9. ID string
  10. Title string
  11. MessageCount int64
  12. PromptTokens int64
  13. CompletionTokens int64
  14. Cost float64
  15. CreatedAt int64
  16. UpdatedAt int64
  17. }
  18. type Service interface {
  19. pubsub.Suscriber[Session]
  20. Create(title string) (Session, error)
  21. Get(id string) (Session, error)
  22. List() ([]Session, error)
  23. Save(session Session) (Session, error)
  24. Delete(id string) error
  25. }
  26. type service struct {
  27. *pubsub.Broker[Session]
  28. q db.Querier
  29. ctx context.Context
  30. }
  31. func (s *service) Create(title string) (Session, error) {
  32. dbSession, err := s.q.CreateSession(s.ctx, db.CreateSessionParams{
  33. ID: uuid.New().String(),
  34. Title: title,
  35. })
  36. if err != nil {
  37. return Session{}, err
  38. }
  39. session := s.fromDBItem(dbSession)
  40. s.Publish(pubsub.CreatedEvent, session)
  41. return session, nil
  42. }
  43. func (s *service) Delete(id string) error {
  44. session, err := s.Get(id)
  45. if err != nil {
  46. return err
  47. }
  48. err = s.q.DeleteSession(s.ctx, session.ID)
  49. if err != nil {
  50. return err
  51. }
  52. s.Publish(pubsub.DeletedEvent, session)
  53. return nil
  54. }
  55. func (s *service) Get(id string) (Session, error) {
  56. dbSession, err := s.q.GetSessionByID(s.ctx, id)
  57. if err != nil {
  58. return Session{}, err
  59. }
  60. return s.fromDBItem(dbSession), nil
  61. }
  62. func (s *service) Save(session Session) (Session, error) {
  63. dbSession, err := s.q.UpdateSession(s.ctx, db.UpdateSessionParams{
  64. ID: session.ID,
  65. Title: session.Title,
  66. PromptTokens: session.PromptTokens,
  67. CompletionTokens: session.CompletionTokens,
  68. Cost: session.Cost,
  69. })
  70. if err != nil {
  71. return Session{}, err
  72. }
  73. session = s.fromDBItem(dbSession)
  74. s.Publish(pubsub.UpdatedEvent, session)
  75. return session, nil
  76. }
  77. func (s *service) List() ([]Session, error) {
  78. dbSessions, err := s.q.ListSessions(s.ctx)
  79. if err != nil {
  80. return nil, err
  81. }
  82. sessions := make([]Session, len(dbSessions))
  83. for i, dbSession := range dbSessions {
  84. sessions[i] = s.fromDBItem(dbSession)
  85. }
  86. return sessions, nil
  87. }
  88. func (s service) fromDBItem(item db.Session) Session {
  89. return Session{
  90. ID: item.ID,
  91. Title: item.Title,
  92. MessageCount: item.MessageCount,
  93. PromptTokens: item.PromptTokens,
  94. CompletionTokens: item.CompletionTokens,
  95. Cost: item.Cost,
  96. CreatedAt: item.CreatedAt,
  97. UpdatedAt: item.UpdatedAt,
  98. }
  99. }
  100. func NewService(ctx context.Context, q db.Querier) Service {
  101. broker := pubsub.NewBroker[Session]()
  102. return &service{
  103. broker,
  104. q,
  105. ctx,
  106. }
  107. }