From 5e05f7960feddf39629d56116da724df7f2c26b5 Mon Sep 17 00:00:00 2001 From: Daniel Ponte Date: Sun, 12 Jan 2025 20:08:53 -0500 Subject: [PATCH] NewShare to share service --- pkg/rest/share.go | 192 +++++++++++++++++++++++++++++++++++++++++++++ pkg/share/share.go | 2 +- 2 files changed, 193 insertions(+), 1 deletion(-) diff --git a/pkg/rest/share.go b/pkg/rest/share.go index 2082883..b829f52 100644 --- a/pkg/rest/share.go +++ b/pkg/rest/share.go @@ -37,3 +37,195 @@ func (ia *shareAPI) Subrouter() http.Handler { return r } +func (ia *shareAPI) listIncidents(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + incs := incstore.FromCtx(ctx) + + p := incstore.IncidentsParams{} + err := forms.Unmarshal(r, &p, forms.WithTag("json"), forms.WithAcceptBlank(), forms.WithOmitEmpty()) + if err != nil { + wErr(w, r, badRequest(err)) + return + } + + res := struct { + Incidents []incstore.Incident `json:"incidents"` + Count int `json:"count"` + }{} + + res.Incidents, res.Count, err = incs.Incidents(ctx, p) + if err != nil { + wErr(w, r, autoError(err)) + return + } + + respond(w, r, res) +} + +func (ia *shareAPI) createIncident(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + incs := incstore.FromCtx(ctx) + + p := incidents.Incident{} + err := forms.Unmarshal(r, &p, forms.WithTag("json"), forms.WithAcceptBlank(), forms.WithOmitEmpty()) + if err != nil { + wErr(w, r, badRequest(err)) + return + } + + inc, err := incs.CreateIncident(ctx, p) + if err != nil { + wErr(w, r, autoError(err)) + return + } + + respond(w, r, inc) +} + +func (ia *shareAPI) getIncident(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + incs := incstore.FromCtx(ctx) + + id, err := idOnlyParam(w, r) + if err != nil { + return + } + + inc, err := incs.Incident(ctx, id) + if err != nil { + wErr(w, r, autoError(err)) + return + } + + respond(w, r, inc) +} + +func (ia *shareAPI) updateIncident(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + incs := incstore.FromCtx(ctx) + + id, err := idOnlyParam(w, r) + if err != nil { + return + } + + p := incstore.UpdateIncidentParams{} + err = forms.Unmarshal(r, &p, forms.WithTag("json"), forms.WithAcceptBlank(), forms.WithOmitEmpty()) + if err != nil { + wErr(w, r, badRequest(err)) + return + } + + inc, err := incs.UpdateIncident(ctx, id, p) + if err != nil { + wErr(w, r, autoError(err)) + return + } + + respond(w, r, inc) +} + +func (ia *shareAPI) deleteIncident(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + incs := incstore.FromCtx(ctx) + + urlParams := struct { + ID uuid.UUID `param:"id"` + }{} + + err := decodeParams(&urlParams, r) + if err != nil { + wErr(w, r, badRequest(err)) + return + } + + err = incs.DeleteIncident(ctx, urlParams.ID) + if err != nil { + wErr(w, r, autoError(err)) + return + } + + w.WriteHeader(http.StatusNoContent) +} + +type CallIncidentParams2 struct { + Add jsontypes.UUIDs `json:"add"` + Notes json.RawMessage `json:"notes"` + + Remove jsontypes.UUIDs `json:"remove"` +} + +func (ia *shareAPI) postCalls(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + incs := incstore.FromCtx(ctx) + + id, err := idOnlyParam(w, r) + if err != nil { + return + } + + p := CallIncidentParams2{} + err = forms.Unmarshal(r, &p, forms.WithTag("json"), forms.WithAcceptBlank(), forms.WithOmitEmpty()) + if err != nil { + wErr(w, r, badRequest(err)) + return + } + + err = incs.AddRemoveIncidentCalls(ctx, id, p.Add.UUIDs(), p.Notes, p.Remove.UUIDs()) + if err != nil { + wErr(w, r, autoError(err)) + return + } + + w.WriteHeader(http.StatusNoContent) +} + +func (ia *shareAPI) getCallsM3U(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + incs := incstore.FromCtx(ctx) + tgst := tgstore.FromCtx(ctx) + + id, err := idOnlyParam(w, r) + if err != nil { + return + } + + inc, err := incs.Incident(ctx, id) + if err != nil { + wErr(w, r, autoError(err)) + return + } + + b := new(bytes.Buffer) + + callUrl := common.PtrTo(*ia.baseURL) + + b.WriteString("#EXTM3U\n\n") + for _, c := range inc.Calls { + tg, err := tgst.TG(ctx, c.TalkgroupTuple()) + if err != nil { + wErr(w, r, autoError(err)) + return + } + var from string + if c.Source != 0 { + from = fmt.Sprintf(" from %d", c.Source) + } + + callUrl.Path = "/api/call/" + c.ID.String() + + fmt.Fprintf(b, "#EXTINF:%d,%s%s (%s)\n%s\n\n", + c.Duration.Seconds(), + tg.StringTag(true), + from, + c.DateTime.Format("15:04 01/02"), + callUrl, + ) + } + + // Not a lot of agreement on which MIME type to use for non-HLS m3u, + // let's hope this is good enough + w.Header().Set("Content-Type", "audio/x-mpegurl") + w.WriteHeader(http.StatusOK) + _, _ = b.WriteTo(w) +} diff --git a/pkg/share/share.go b/pkg/share/share.go index 204dfc9..912ab58 100644 --- a/pkg/share/share.go +++ b/pkg/share/share.go @@ -31,7 +31,7 @@ type Share struct { } // NewShare creates a new share. -func NewShare(ctx context.Context, shType EntityType, shID uuid.UUID, exp *time.Duration) (id string, err error) { +func (s *service) NewShare(ctx context.Context, shType EntityType, shID uuid.UUID, exp *time.Duration) (id string, err error) { id, err = gonanoid.ID(SlugLength) if err != nil { return