1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
2//
3// SPDX-License-Identifier: AGPL-3.0-or-later
4
5package cmd
6
7import (
8 "fmt"
9 "os"
10
11 "git.secluded.site/np/cmd/shared"
12 "github.com/spf13/cobra"
13)
14
15var aCmd = &cobra.Command{
16 Use: "a",
17 Short: "Archive session",
18 Long: `Archive the current session`,
19 RunE: runArchiveSession,
20}
21
22func runArchiveSession(cmd *cobra.Command, args []string) error {
23 env, err := shared.Environment(cmd)
24 if err != nil {
25 return err
26 }
27
28 cwd, err := os.Getwd()
29 if err != nil {
30 return fmt.Errorf("determine working directory: %w", err)
31 }
32
33 // Try to get active session (without printing error message)
34 sessionDoc, found, err := env.ActiveSession(cmd.Context(), cwd)
35 if err != nil {
36 return err
37 }
38
39 if !found {
40 // Check if there's already an archived session (idempotency check)
41 archivedDoc, foundArchived, err := env.SessionStore.LatestArchivedByPath(cmd.Context(), cwd)
42 if err != nil {
43 return err
44 }
45
46 if foundArchived {
47 // Session already archived, idempotent operation
48 out := cmd.OutOrStdout()
49 _, _ = fmt.Fprintf(out, env.Localizer.T("session.archive.success"), archivedDoc.SID)
50 return nil
51 }
52
53 // No session at all (neither active nor archived)
54 _, _ = fmt.Fprintln(cmd.OutOrStdout(), env.Localizer.T("session.archive.none_active"))
55 return nil
56 }
57
58 archived, err := env.SessionStore.Archive(cmd.Context(), sessionDoc.SID)
59 if err != nil {
60 return err
61 }
62
63 out := cmd.OutOrStdout()
64 _, _ = fmt.Fprintf(out, env.Localizer.T("session.archive.success"), archived.SID)
65 return nil
66}