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