session.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "git.andreafazzi.eu/andrea/probo/lib/sessionmanager"
  6. "git.andreafazzi.eu/andrea/probo/lib/store/file"
  7. "github.com/charmbracelet/bubbles/textinput"
  8. tea "github.com/charmbracelet/bubbletea"
  9. "github.com/urfave/cli/v2"
  10. )
  11. type model struct {
  12. textInput textinput.Model
  13. err error
  14. }
  15. type (
  16. errMsg error
  17. )
  18. func initialModel() *model {
  19. ti := textinput.New()
  20. ti.Placeholder = "My exam session"
  21. ti.Focus()
  22. ti.CharLimit = 156
  23. ti.Width = 20
  24. return &model{
  25. textInput: ti,
  26. err: nil,
  27. }
  28. }
  29. func (m *model) Init() tea.Cmd {
  30. return textinput.Blink
  31. }
  32. func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
  33. var cmd tea.Cmd
  34. switch msg := msg.(type) {
  35. case tea.KeyMsg:
  36. switch msg.Type {
  37. case tea.KeyEnter, tea.KeyCtrlC, tea.KeyEsc:
  38. return m, tea.Quit
  39. }
  40. // We handle errors just like any other message
  41. case errMsg:
  42. m.err = msg
  43. return m, nil
  44. }
  45. m.textInput, cmd = m.textInput.Update(msg)
  46. return m, cmd
  47. }
  48. func (m *model) View() string {
  49. return fmt.Sprintf(
  50. "\nPlease insert the name of the session\n\n%s\n\n%s",
  51. m.textInput.View(),
  52. "(esc to quit)",
  53. ) + "\n"
  54. }
  55. func push(cCtx *cli.Context) error {
  56. pStore, err := file.NewParticipantDefaultFileStore()
  57. if err != nil {
  58. return cli.Exit(fmt.Sprintf("An error occurred: %v", err), 1)
  59. }
  60. participants := pStore.ReadAll()
  61. if len(participants) == 0 {
  62. return cli.Exit("No participants found!", 1)
  63. }
  64. sessionName := cCtx.Args().First()
  65. if cCtx.Args().Len() < 1 {
  66. m := initialModel()
  67. p := tea.NewProgram(m)
  68. if _, err := p.Run(); err != nil {
  69. log.Fatal(err)
  70. }
  71. sessionName = m.textInput.Value()
  72. }
  73. sStore, err := file.NewDefaultSessionFileStore()
  74. if err != nil {
  75. log.Fatalf("An error occurred: %v", err)
  76. }
  77. qStore, err := file.NewDefaultQuizFileStore()
  78. if err != nil {
  79. log.Fatalf("An error occurred: %v", err)
  80. }
  81. sm, err := sessionmanager.NewSessionManager(
  82. "http://localhost:8080/",
  83. pStore.Storer,
  84. qStore.Storer,
  85. nil,
  86. nil,
  87. )
  88. if err != nil {
  89. log.Fatalf("An error occurred: %v", err)
  90. }
  91. session, err := sm.Push(sessionName)
  92. if err != nil {
  93. log.Fatalf("An error occurred: %v", err)
  94. }
  95. _, err = sStore.Create(session)
  96. if err != nil {
  97. log.Fatalf("An error occurred: %v", err)
  98. }
  99. log.Println("Session upload completed with success!")
  100. for _, p := range pStore.ReadAll() {
  101. log.Printf("http://localhost:8080/%v/%v", session.ID, p.Token)
  102. }
  103. return nil
  104. }
  105. func pull(cCtx *cli.Context) error {
  106. if cCtx.Args().Len() < 1 {
  107. log.Fatalf("Please provide a session ID as first argument of pull.")
  108. }
  109. rStore, err := file.NewDefaultResponseFileStore()
  110. if err != nil {
  111. log.Fatalf("An error occurred: %v", err)
  112. }
  113. pStore, err := file.NewParticipantDefaultFileStore()
  114. if err != nil {
  115. log.Fatalf("An error occurred: %v", err)
  116. }
  117. qStore, err := file.NewDefaultQuizFileStore()
  118. if err != nil {
  119. log.Fatalf("An error occurred: %v", err)
  120. }
  121. sm, err := sessionmanager.NewSessionManager(
  122. "http://localhost:8080/",
  123. pStore.Storer,
  124. qStore.Storer,
  125. nil,
  126. nil,
  127. )
  128. if err != nil {
  129. log.Fatalf("An error occurred: %v", err)
  130. }
  131. err = sm.Pull(rStore, cCtx.Args().First())
  132. if err != nil {
  133. log.Fatalf("An error occurred: %v", err)
  134. }
  135. log.Println("Responses download completed with success!")
  136. return nil
  137. }
  138. func scores(cCtx *cli.Context) error {
  139. if cCtx.Args().Len() < 1 {
  140. log.Fatalf("Please provide a session name as first argument of 'score'.")
  141. }
  142. sStore, err := file.NewDefaultSessionFileStore()
  143. if err != nil {
  144. log.Fatalf("An error occurred: %v", err)
  145. }
  146. session, err := sStore.Read(cCtx.Args().First())
  147. if err != nil {
  148. log.Fatalf("An error occurred: %v", err)
  149. }
  150. rStore, err := file.NewDefaultResponseFileStore()
  151. if err != nil {
  152. log.Fatalf("An error occurred: %v", err)
  153. }
  154. scores, err := sessionmanager.NewScores(rStore, session)
  155. if err != nil {
  156. log.Fatalf("An error occurred: %v", err)
  157. }
  158. fmt.Println(scores)
  159. return nil
  160. }