autocomplete.go 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package costmodel
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "github.com/julienschmidt/httprouter"
  7. "github.com/opencost/opencost/core/pkg/autocomplete"
  8. coreallocation "github.com/opencost/opencost/core/pkg/autocomplete/allocation"
  9. coreasset "github.com/opencost/opencost/core/pkg/autocomplete/asset"
  10. "github.com/opencost/opencost/core/pkg/opencost"
  11. "github.com/opencost/opencost/core/pkg/util/httputil"
  12. "github.com/opencost/opencost/pkg/allocation"
  13. "github.com/opencost/opencost/pkg/asset"
  14. "github.com/opencost/opencost/pkg/env"
  15. )
  16. func (a *Accesses) ComputeAllocationAutocompleteHandler(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
  17. w.Header().Set("Content-Type", "application/json")
  18. qp := httputil.NewQueryParams(r.URL.Query())
  19. offset := env.GetParsedUTCOffset()
  20. req, err := coreallocation.ParseRequest(qp, autocomplete.ParseOptions{
  21. LabelConfig: opencost.NewLabelConfig(),
  22. UTCOffset: &offset,
  23. })
  24. if err != nil {
  25. http.Error(w, fmt.Sprintf("Invalid allocation autocomplete request: %s", err), http.StatusBadRequest)
  26. return
  27. }
  28. filterString := qp.Get("filter", "")
  29. resp, err := a.QueryAllocationAutocomplete(*req, filterString, r.Context())
  30. if err != nil {
  31. status := http.StatusInternalServerError
  32. if autocomplete.IsBadRequest(err) {
  33. status = http.StatusBadRequest
  34. }
  35. http.Error(w, fmt.Sprintf("Error getting allocation autocomplete: %s", err), status)
  36. return
  37. }
  38. WriteData(w, resp, nil)
  39. }
  40. func (a *Accesses) QueryAllocationAutocomplete(req autocomplete.Request, filterString string, ctx context.Context) (*autocomplete.Response, error) {
  41. asr, err := a.Model.QueryAllocation(req.Window, req.Window.Duration(), nil, false, false, false, false, false, opencost.AccumulateOptionNone, false, filterString)
  42. if err != nil {
  43. return nil, fmt.Errorf("error querying allocations: %w", err)
  44. }
  45. return allocation.QueryAllocationAutocompleteFromSetRange(asr, req)
  46. }
  47. func (a *Accesses) ComputeAssetsAutocompleteHandler(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
  48. w.Header().Set("Content-Type", "application/json")
  49. qp := httputil.NewQueryParams(r.URL.Query())
  50. offset := env.GetParsedUTCOffset()
  51. req, err := coreasset.ParseRequest(qp, autocomplete.ParseOptions{
  52. DefaultTenantID: "opencost",
  53. UTCOffset: &offset,
  54. })
  55. if err != nil {
  56. http.Error(w, fmt.Sprintf("Invalid asset autocomplete request: %s", err), http.StatusBadRequest)
  57. return
  58. }
  59. resp, err := a.QueryAssetAutocomplete(*req, r.Context())
  60. if err != nil {
  61. status := http.StatusInternalServerError
  62. if autocomplete.IsBadRequest(err) {
  63. status = http.StatusBadRequest
  64. }
  65. http.Error(w, fmt.Sprintf("Error getting asset autocomplete: %s", err), status)
  66. return
  67. }
  68. WriteData(w, resp, nil)
  69. }
  70. func (a *Accesses) QueryAssetAutocomplete(req autocomplete.Request, ctx context.Context) (*autocomplete.Response, error) {
  71. if req.Window.IsOpen() || req.Window.Start() == nil || req.Window.End() == nil {
  72. return nil, fmt.Errorf("%w: invalid window: %s", autocomplete.ErrBadRequest, req.Window.String())
  73. }
  74. assetSet, err := a.Model.ComputeAssets(*req.Window.Start(), *req.Window.End())
  75. if err != nil {
  76. return nil, fmt.Errorf("error computing assets: %w", err)
  77. }
  78. return asset.QueryAssetAutocompleteFromSet(assetSet, req)
  79. }