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}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 8

Tags 42

↑↓ moveenter openesc close