delete_session.go RawHistoryFolder
1package usecase
2
3import (
4 "context"
5 "errors"
6
7 "github.com/bnema/dumber/internal/domain/entity"
8 "github.com/bnema/dumber/internal/domain/repository"
9 "github.com/bnema/dumber/internal/logging"
10)
11
12// DeleteSessionUseCase errors.
13var (
14 ErrCannotDeleteCurrentSession = errors.New("cannot delete current session")
15 ErrCannotDeleteActiveSession = errors.New("cannot delete active session")
16)
17
18// DeleteSessionUseCase handles session deletion with proper validation.
19type DeleteSessionUseCase struct {
20 stateRepo repository.SessionStateRepository
21 sessionRepo repository.SessionRepository
22}
23
24// NewDeleteSessionUseCase creates a new DeleteSessionUseCase.
25func NewDeleteSessionUseCase(
26 stateRepo repository.SessionStateRepository,
27 sessionRepo repository.SessionRepository,
28) *DeleteSessionUseCase {
29 return &DeleteSessionUseCase{
30 stateRepo: stateRepo,
31 sessionRepo: sessionRepo,
32 }
33}
34
35// DeleteSessionInput contains the parameters for session deletion.
36type DeleteSessionInput struct {
37 SessionID entity.SessionID
38 CurrentSessionID entity.SessionID
39}
40
41// Execute deletes a session and its state snapshot.
42// It validates that the session is not current or active before deletion.
43func (uc *DeleteSessionUseCase) Execute(ctx context.Context, input DeleteSessionInput) error {
44 log := logging.FromContext(ctx)
45
46 // Validate not deleting current session
47 if input.SessionID == input.CurrentSessionID && input.CurrentSessionID != "" {
48 return ErrCannotDeleteCurrentSession
49 }
50
51 // Check session exists
52 session, err := uc.sessionRepo.FindByID(ctx, input.SessionID)
53 if err != nil {
54 return err
55 }
56 if session == nil {
57 return ErrSessionNotFound
58 }
59
60 // Don't delete active sessions.
61 if session.IsActive() {
62 return ErrCannotDeleteActiveSession
63 }
64
65 log.Info().Str("session_id", string(input.SessionID)).Msg("deleting session")
66
67 // Delete snapshot (ignore "not found" - session may not have a snapshot)
68 if uc.stateRepo != nil {
69 if err := uc.stateRepo.DeleteSnapshot(ctx, input.SessionID); err != nil {
70 log.Debug().Err(err).Msg("failed to delete session snapshot (may not exist)")
71 }
72 }
73
74 // Delete session record
75 return uc.sessionRepo.Delete(ctx, input.SessionID)
76}