handouts.go
⎇
Raw
1package web
2
3import (
4 "net/http"
5 "time"
6
7 "forge.gpl-nas.de/physiobase/internal/store"
8)
9
10func (s *Server) listHandouts(w http.ResponseWriter, r *http.Request) {
11 hs, err := s.st.Handouts(r.Context())
12 if err != nil {
13 s.fail(w, r, err)
14 return
15 }
16 s.render(w, r, "handouts", http.StatusOK, map[string]any{"Handouts": hs})
17}
18
19func (s *Server) createHandout(w http.ResponseWriter, r *http.Request) {
20 if !limitForm(w, r) {
21 return
22 }
23 ctx := r.Context()
24 title := formText(r, "title")
25 if title == "" {
26 title = "Mein Übungsprogramm"
27 }
28 id, err := s.st.CreateHandout(ctx, title, formText(r, "recipient"))
29 if err != nil {
30 s.fail(w, r, err)
31 return
32 }
33 // Direkt mit einer Übung starten (Knopf auf der Übungsseite)
34 if eid, ok := formID(r, "entry"); ok {
35 if err := s.st.AddHandoutItem(ctx, id, eid); err != nil {
36 s.fail(w, r, err)
37 return
38 }
39 }
40 redirect(w, r, "/handout/%d", id)
41}
42
43func (s *Server) showHandout(w http.ResponseWriter, r *http.Request) {
44 ctx := r.Context()
45 id, ok := pathID(r, "id")
46 if !ok {
47 http.NotFound(w, r)
48 return
49 }
50 h, err := s.st.Handout(ctx, id)
51 if err != nil {
52 s.fail(w, r, err)
53 return
54 }
55 items, err := s.st.HandoutItems(ctx, id)
56 if err != nil {
57 s.fail(w, r, err)
58 return
59 }
60 exercises, err := s.st.ExercisesNotIn(ctx, id)
61 if err != nil {
62 s.fail(w, r, err)
63 return
64 }
65 pid, pname, err := s.st.HandoutPatient(ctx, id)
66 if err != nil {
67 s.fail(w, r, err)
68 return
69 }
70 s.render(w, r, "handout", http.StatusOK, map[string]any{
71 "H": h, "Items": items, "Exercises": exercises,
72 "PatientID": pid, "PatientName": pname,
73 })
74}
75
76func (s *Server) updateHandout(w http.ResponseWriter, r *http.Request) {
77 if !limitForm(w, r) {
78 return
79 }
80 id, ok := pathID(r, "id")
81 if !ok {
82 http.NotFound(w, r)
83 return
84 }
85 h := store.Handout{ID: id, Title: formText(r, "title"), Recipient: formText(r, "recipient"), Notes: formText(r, "notes")}
86 if h.Title == "" {
87 h.Title = "Mein Übungsprogramm"
88 }
89 if err := s.st.UpdateHandout(r.Context(), h); err != nil {
90 s.fail(w, r, err)
91 return
92 }
93 redirect(w, r, "/handout/%d", id)
94}
95
96func (s *Server) deleteHandout(w http.ResponseWriter, r *http.Request) {
97 id, ok := pathID(r, "id")
98 if !ok {
99 http.NotFound(w, r)
100 return
101 }
102 if err := s.st.DeleteHandout(r.Context(), id); err != nil {
103 s.fail(w, r, err)
104 return
105 }
106 redirect(w, r, "/handouts")
107}
108
109func (s *Server) copyHandout(w http.ResponseWriter, r *http.Request) {
110 id, ok := pathID(r, "id")
111 if !ok {
112 http.NotFound(w, r)
113 return
114 }
115 nid, err := s.st.CopyHandout(r.Context(), id)
116 if err != nil {
117 s.fail(w, r, err)
118 return
119 }
120 redirect(w, r, "/handout/%d", nid)
121}
122
123func (s *Server) addHandoutItem(w http.ResponseWriter, r *http.Request) {
124 if !limitForm(w, r) {
125 return
126 }
127 id, ok1 := pathID(r, "id")
128 eid, ok2 := formID(r, "entry")
129 if !ok1 || !ok2 {
130 http.Error(w, "Bitte eine Übung auswählen", http.StatusBadRequest)
131 return
132 }
133 if err := s.st.AddHandoutItem(r.Context(), id, eid); err != nil {
134 s.fail(w, r, err)
135 return
136 }
137 if r.FormValue("from") == "entry" {
138 redirect(w, r, "/eintrag/%d?handout=%d", eid, id)
139 return
140 }
141 redirect(w, r, "/handout/%d", id)
142}
143
144func (s *Server) itemIDs(w http.ResponseWriter, r *http.Request) (int64, int64, bool) {
145 id, ok1 := pathID(r, "id")
146 eid, ok2 := pathID(r, "eid")
147 if !ok1 || !ok2 {
148 http.NotFound(w, r)
149 return 0, 0, false
150 }
151 return id, eid, true
152}
153
154func (s *Server) updateHandoutItem(w http.ResponseWriter, r *http.Request) {
155 if !limitForm(w, r) {
156 return
157 }
158 id, eid, ok := s.itemIDs(w, r)
159 if !ok {
160 return
161 }
162 if err := s.st.UpdateHandoutItem(r.Context(), id, eid, formText(r, "dosage"), formText(r, "note")); err != nil {
163 s.fail(w, r, err)
164 return
165 }
166 redirect(w, r, "/handout/%d#u%d", id, eid)
167}
168
169func (s *Server) moveHandoutItem(w http.ResponseWriter, r *http.Request) {
170 id, eid, ok := s.itemIDs(w, r)
171 if !ok {
172 return
173 }
174 if err := s.st.MoveHandoutItemUp(r.Context(), id, eid); err != nil {
175 s.fail(w, r, err)
176 return
177 }
178 redirect(w, r, "/handout/%d#u%d", id, eid)
179}
180
181func (s *Server) removeHandoutItem(w http.ResponseWriter, r *http.Request) {
182 id, eid, ok := s.itemIDs(w, r)
183 if !ok {
184 return
185 }
186 if err := s.st.RemoveHandoutItem(r.Context(), id, eid); err != nil {
187 s.fail(w, r, err)
188 return
189 }
190 redirect(w, r, "/handout/%d", id)
191}
192
193func (s *Server) printHandout(w http.ResponseWriter, r *http.Request) {
194 ctx := r.Context()
195 id, ok := pathID(r, "id")
196 if !ok {
197 http.NotFound(w, r)
198 return
199 }
200 h, err := s.st.Handout(ctx, id)
201 if err != nil {
202 s.fail(w, r, err)
203 return
204 }
205 items, err := s.st.HandoutItems(ctx, id)
206 if err != nil {
207 s.fail(w, r, err)
208 return
209 }
210 s.render(w, r, "print", http.StatusOK, map[string]any{"H": h, "Items": items, "Today": time.Now()})
211}
212
213// addToHandout: von der Übungsseite aus, Handout per Auswahlliste (ohne JS).
214func (s *Server) addToHandout(w http.ResponseWriter, r *http.Request) {
215 if !limitForm(w, r) {
216 return
217 }
218 hid, ok1 := formID(r, "handout")
219 eid, ok2 := formID(r, "entry")
220 if !ok1 || !ok2 {
221 http.Error(w, "Bitte Handout und Übung auswählen", http.StatusBadRequest)
222 return
223 }
224 if err := s.st.AddHandoutItem(r.Context(), hid, eid); err != nil {
225 s.fail(w, r, err)
226 return
227 }
228 redirect(w, r, "/eintrag/%d?handout=%d#handout", eid, hid)
229}
230