session.go

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