diff --git a/api/queryService/api.gen.go b/api/queryService/api.gen.go index 2a9b0846..1579ebff 100644 --- a/api/queryService/api.gen.go +++ b/api/queryService/api.gen.go @@ -141,9 +141,6 @@ type Job struct { // Id The job id Id openapi_types.UUID `json:"id"` - - // Status Specifies the status of a job. - Status JobStatus `json:"status"` } // JobClient defines model for JobClient. @@ -212,6 +209,15 @@ type JobCreate struct { // JobStatus Specifies the status of a job. type JobStatus string +// JobStatusBody defines model for JobStatusBody. +type JobStatusBody struct { + // JobId The job id + JobId openapi_types.UUID `json:"job_id"` + + // Status Specifies the status of a job. + Status JobStatus `json:"status"` +} + // JobUpdate defines model for JobUpdate. type JobUpdate struct { // CanSync Specifies whether the job is actively syncing @@ -352,6 +358,9 @@ type ServerInterface interface { // Check export state. // (GET /job/{id}/export) ExportState(ctx echo.Context, id openapi_types.UUID) error + // Get job status by job ID + // (GET /job/{id}/status) + GetJobStatusByJobId(ctx echo.Context, id openapi_types.UUID) error // List queries // (GET /query) ListQueries(ctx echo.Context) error @@ -529,6 +538,22 @@ func (w *ServerInterfaceWrapper) ExportState(ctx echo.Context) error { return err } +// GetJobStatusByJobId converts echo context to params. +func (w *ServerInterfaceWrapper) GetJobStatusByJobId(ctx echo.Context) error { + var err error + // ------------- Path parameter "id" ------------- + var id openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "id", ctx.Param("id"), &id, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter id: %s", err)) + } + + // Invoke the callback with all the unmarshaled arguments + err = w.Handler.GetJobStatusByJobId(ctx, id) + return err +} + // ListQueries converts echo context to params. func (w *ServerInterfaceWrapper) ListQueries(ctx echo.Context) error { var err error @@ -634,6 +659,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.PATCH(baseURL+"/job/:id/collector", wrapper.UpdateJobCollectorByJobId) router.GET(baseURL+"/job/:id/documents", wrapper.ListDocumentsByJobId) router.GET(baseURL+"/job/:id/export", wrapper.ExportState) + router.GET(baseURL+"/job/:id/status", wrapper.GetJobStatusByJobId) router.GET(baseURL+"/query", wrapper.ListQueries) router.POST(baseURL+"/query", wrapper.CreateQuery) router.GET(baseURL+"/query/:id", wrapper.GetQuery) @@ -645,51 +671,51 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "PgtHPwAA", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/queryService/job.go b/api/queryService/job.go index 57cc49d2..8f0c6002 100644 --- a/api/queryService/job.go +++ b/api/queryService/job.go @@ -26,16 +26,27 @@ func (s *Controllers) CreateJob(ctx echo.Context) error { } func (s *Controllers) GetJob(ctx echo.Context, id types.UUID) error { - job, err := s.svc.Job.GetWithStatus(ctx.Request().Context(), id) + job, err := s.svc.Job.Get(ctx.Request().Context(), id) if err != nil { return echo.NewHTTPError(http.StatusNotFound, fmt.Sprintf("Unable to find job: %s", err)) } return ctx.JSON(http.StatusOK, Job{ - Id: job.Job.ID, - ClientId: job.Job.ClientID, - CanSync: job.Job.CanSync, - Status: parseJobStatus(job.Status), + Id: job.ID, + ClientId: job.ClientID, + CanSync: job.CanSync, + }) +} + +func (s *Controllers) GetJobStatusByJobId(ctx echo.Context, id types.UUID) error { + status, err := s.svc.Job.GetStatus(ctx.Request().Context(), id) + if err != nil { + return echo.NewHTTPError(http.StatusNotFound, fmt.Sprintf("Unable to find job: %s", err)) + } + + return ctx.JSON(http.StatusOK, JobStatusBody{ + JobId: id, + Status: parseJobStatus(*status), }) } diff --git a/api/queryService/job_test.go b/api/queryService/job_test.go index 94bf313e..f2aaec9f 100644 --- a/api/queryService/job_test.go +++ b/api/queryService/job_test.go @@ -125,7 +125,44 @@ func TestGetJob(t *testing.T) { Id: j.ID, ClientId: j.ClientID, CanSync: j.CanSync, - Status: queryservice.INSYNC, + }, res) +} + +func TestGetJobStatus(t *testing.T) { + pool, err := pgxmock.NewPool() + require.NoError(t, err) + cfg := &serviceconfig.BaseConfig{} + cfg.DBPool = pool + cfg.DBQueries = repository.New(pool) + + cons := queryservice.NewControllers(validator.New(), &queryservice.Services{ + Job: job.New(cfg, &job.Services{ + Client: client.New(cfg), + }), + }) + + e := echo.New() + req := httptest.NewRequest(http.MethodPost, "/", strings.NewReader("")) + rec := httptest.NewRecorder() + ctx := e.NewContext(req, rec) + + jobId := uuid.New() + + pool.ExpectQuery("name: IsJobSynced :one").WithArgs(database.MustToDBUUID(jobId)).WillReturnRows( + pgxmock.NewRows([]string{"issynced"}). + AddRow(true), + ) + + err = cons.GetJobStatusByJobId(ctx, jobId) + assert.NoError(t, err) + assert.Equal(t, http.StatusOK, rec.Code) + + var res queryservice.JobStatusBody + err = json.Unmarshal(rec.Body.Bytes(), &res) + assert.NoError(t, err) + assert.EqualExportedValues(t, queryservice.JobStatusBody{ + JobId: jobId, + Status: queryservice.INSYNC, }, res) } diff --git a/internal/job/get.go b/internal/job/get.go index fb248962..51b28311 100644 --- a/internal/job/get.go +++ b/internal/job/get.go @@ -29,25 +29,3 @@ func (s *Service) Get(ctx context.Context, id uuid.UUID) (*Job, error) { CanSync: canSync, }, nil } - -type JobWithStatus struct { - Job *Job - Status Status -} - -func (s *Service) GetWithStatus(ctx context.Context, id uuid.UUID) (*JobWithStatus, error) { - job, err := s.Get(ctx, id) - if err != nil { - return nil, err - } - - status, err := s.GetStatus(ctx, id) - if err != nil { - return nil, err - } - - return &JobWithStatus{ - Job: job, - Status: *status, - }, nil -} diff --git a/internal/job/get_test.go b/internal/job/get_test.go index 3e88bd5b..db86c850 100644 --- a/internal/job/get_test.go +++ b/internal/job/get_test.go @@ -73,50 +73,3 @@ func TestGet(t *testing.T) { CanSync: true, }, ajob) } - -func TestGetWithStatus(t *testing.T) { - ctx := context.Background() - - pool, err := pgxmock.NewPool() - require.NoError(t, err) - cfg := &serviceconfig.BaseConfig{} - cfg.DBPool = pool - cfg.DBQueries = repository.New(pool) - - svc := job.New(cfg, &job.Services{ - Collector: collector.New(cfg, &collector.Services{}), - Client: client.New(cfg), - }) - - j := job.Job{ - ID: uuid.New(), - ClientID: uuid.New(), - CanSync: true, - } - - pool.ExpectQuery("name: GetJob :one").WithArgs(database.MustToDBUUID(j.ID)).WillReturnRows( - pgxmock.NewRows([]string{"id", "clientId", "canSync"}). - AddRow(database.MustToDBUUID(j.ID), database.MustToDBUUID(j.ClientID), j.CanSync), - ) - pool.ExpectQuery("name: GetClient :one").WithArgs(database.MustToDBUUID(j.ClientID)). - WillReturnRows( - pgxmock.NewRows([]string{"id", "name", "canSync"}). - AddRow(database.MustToDBUUID(j.ClientID), "client_name", false), - ) - pool.ExpectQuery("name: IsJobSynced :one").WithArgs(database.MustToDBUUID(j.ID)).WillReturnRows( - pgxmock.NewRows([]string{"issynced"}). - AddRow(true), - ) - - ajob, err := svc.GetWithStatus(ctx, j.ID) - assert.NoError(t, err) - jStatus := job.IN_SYNC - assert.EqualExportedValues(t, &job.JobWithStatus{ - Job: &job.Job{ - ID: j.ID, - ClientID: j.ClientID, - CanSync: false, - }, - Status: jStatus, - }, ajob) -} diff --git a/pkg/queryService/api.gen.go b/pkg/queryService/api.gen.go index f547ddcb..74744882 100644 --- a/pkg/queryService/api.gen.go +++ b/pkg/queryService/api.gen.go @@ -139,9 +139,6 @@ type Job struct { // Id The job id Id openapi_types.UUID `json:"id"` - - // Status Specifies the status of a job. - Status JobStatus `json:"status"` } // JobClient defines model for JobClient. @@ -210,6 +207,15 @@ type JobCreate struct { // JobStatus Specifies the status of a job. type JobStatus string +// JobStatusBody defines model for JobStatusBody. +type JobStatusBody struct { + // JobId The job id + JobId openapi_types.UUID `json:"job_id"` + + // Status Specifies the status of a job. + Status JobStatus `json:"status"` +} + // JobUpdate defines model for JobUpdate. type JobUpdate struct { // CanSync Specifies whether the job is actively syncing @@ -433,6 +439,9 @@ type ClientInterface interface { // ExportState request ExportState(ctx context.Context, id openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetJobStatusByJobId request + GetJobStatusByJobId(ctx context.Context, id openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) + // ListQueries request ListQueries(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -659,6 +668,18 @@ func (c *Client) ExportState(ctx context.Context, id openapi_types.UUID, reqEdit return c.Client.Do(req) } +func (c *Client) GetJobStatusByJobId(ctx context.Context, id openapi_types.UUID, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetJobStatusByJobIdRequest(c.Server, id) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) ListQueries(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewListQueriesRequest(c.Server) if err != nil { @@ -1186,6 +1207,40 @@ func NewExportStateRequest(server string, id openapi_types.UUID) (*http.Request, return req, nil } +// NewGetJobStatusByJobIdRequest generates requests for GetJobStatusByJobId +func NewGetJobStatusByJobIdRequest(server string, id openapi_types.UUID) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "id", runtime.ParamLocationPath, id) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/job/%s/status", pathParam0) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + // NewListQueriesRequest generates requests for ListQueries func NewListQueriesRequest(server string) (*http.Request, error) { var err error @@ -1469,6 +1524,9 @@ type ClientWithResponsesInterface interface { // ExportStateWithResponse request ExportStateWithResponse(ctx context.Context, id openapi_types.UUID, reqEditors ...RequestEditorFn) (*ExportStateResponse, error) + // GetJobStatusByJobIdWithResponse request + GetJobStatusByJobIdWithResponse(ctx context.Context, id openapi_types.UUID, reqEditors ...RequestEditorFn) (*GetJobStatusByJobIdResponse, error) + // ListQueriesWithResponse request ListQueriesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*ListQueriesResponse, error) @@ -1730,6 +1788,28 @@ func (r ExportStateResponse) StatusCode() int { return 0 } +type GetJobStatusByJobIdResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *JobStatusBody +} + +// Status returns HTTPResponse.Status +func (r GetJobStatusByJobIdResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r GetJobStatusByJobIdResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type ListQueriesResponse struct { Body []byte HTTPResponse *http.Response @@ -1986,6 +2066,15 @@ func (c *ClientWithResponses) ExportStateWithResponse(ctx context.Context, id op return ParseExportStateResponse(rsp) } +// GetJobStatusByJobIdWithResponse request returning *GetJobStatusByJobIdResponse +func (c *ClientWithResponses) GetJobStatusByJobIdWithResponse(ctx context.Context, id openapi_types.UUID, reqEditors ...RequestEditorFn) (*GetJobStatusByJobIdResponse, error) { + rsp, err := c.GetJobStatusByJobId(ctx, id, reqEditors...) + if err != nil { + return nil, err + } + return ParseGetJobStatusByJobIdResponse(rsp) +} + // ListQueriesWithResponse request returning *ListQueriesResponse func (c *ClientWithResponses) ListQueriesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*ListQueriesResponse, error) { rsp, err := c.ListQueries(ctx, reqEditors...) @@ -2311,6 +2400,32 @@ func ParseExportStateResponse(rsp *http.Response) (*ExportStateResponse, error) return response, nil } +// ParseGetJobStatusByJobIdResponse parses an HTTP response from a GetJobStatusByJobIdWithResponse call +func ParseGetJobStatusByJobIdResponse(rsp *http.Response) (*GetJobStatusByJobIdResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &GetJobStatusByJobIdResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest JobStatusBody + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + } + + return response, nil +} + // ParseListQueriesResponse parses an HTTP response from a ListQueriesWithResponse call func ParseListQueriesResponse(rsp *http.Response) (*ListQueriesResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) diff --git a/serviceAPIs/queryService.yaml b/serviceAPIs/queryService.yaml index 1c6cf74e..3638ab02 100644 --- a/serviceAPIs/queryService.yaml +++ b/serviceAPIs/queryService.yaml @@ -277,6 +277,33 @@ paths: "404": description: Job not found. + /job/{id}/status: + parameters: + - in: path + name: id + required: true + schema: + type: string + format: uuid + description: The job ID for the collector. + get: + operationId: getJobStatusByJobId + tags: + - JobCollectorService + summary: Get job status by job ID + description: Retrieves the job status by its job ID. + responses: + "200": + description: Job status details. + content: + application/json: + schema: + $ref: "#/components/schemas/JobStatusBody" + "400": + description: Invalid request parameters. + "404": + description: Job not found. + /job/{id}/collector: parameters: - in: path @@ -545,12 +572,22 @@ components: can_sync: type: boolean description: Specifies whether the job is actively syncing - status: - $ref: "#/components/schemas/JobStatus" required: - id - client_id - can_sync + + JobStatusBody: + type: object + properties: + job_id: + type: string + format: uuid + description: The job id + status: + $ref: "#/components/schemas/JobStatus" + required: + - job_id - status JobCreate: diff --git a/test/process_test.go b/test/process_test.go index 4976a1cd..ba414222 100644 --- a/test/process_test.go +++ b/test/process_test.go @@ -193,9 +193,7 @@ func TestProcess(t *testing.T) { }) assert.NoError(t, err) - jRes, err := qService.GetJobWithResponse(ctx, jobRes.JSON201.Id) - assert.NoError(t, err) - assert.Equal(t, queryservice.INSYNC, jRes.JSON200.Status) + WaitForJobStatus(t, ctx, qService, jobRes.JSON201.Id, queryservice.INSYNC) location := fmt.Sprintf("%s/%s/%s", clientRes.JSON201.Id, jobRes.JSON201.Id, "object_name") body := strings.NewReader(pdfHelloWorld) @@ -255,7 +253,7 @@ func WaitForJobStatus(t testing.TB, ctx context.Context, service *queryservice.C case <-timeout: require.NoError(t, fmt.Errorf("Timeout waiting for job status to become %s", status)) case <-ticker.C: - jRes, err := service.GetJobWithResponse(ctx, id) + jRes, err := service.GetJobStatusByJobIdWithResponse(ctx, id) if err != nil { assert.NoError(t, err) } diff --git a/test/queryService/job_test.go b/test/queryService/job_test.go index e17b3159..edcc96a5 100644 --- a/test/queryService/job_test.go +++ b/test/queryService/job_test.go @@ -42,7 +42,6 @@ func TestJob(t *testing.T) { assert.Equal(t, id, jobRes.JSON200.Id) assert.Equal(t, clientRes.JSON201.Id, jobRes.JSON200.ClientId) assert.False(t, jobRes.JSON200.CanSync) - assert.Equal(t, queryservice.INSYNC, jobRes.JSON200.Status) updateCanSync := !jobRes.JSON200.CanSync updateRes, err := client.UpdateJobWithResponse(ctx, id, queryservice.JobUpdate{ @@ -56,5 +55,8 @@ func TestJob(t *testing.T) { assert.Equal(t, id, jobRes.JSON200.Id) assert.Equal(t, clientRes.JSON201.Id, jobRes.JSON200.ClientId) assert.False(t, jobRes.JSON200.CanSync) - assert.Equal(t, queryservice.INSYNC, jobRes.JSON200.Status) + + jobStatusRes, err := client.GetJobStatusByJobIdWithResponse(ctx, id) + assert.NoError(t, err) + assert.Equal(t, queryservice.INSYNC, jobStatusRes.JSON200.Status) }