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}