Merged in feature/jobstatusendpoint (pull request #85)

Job Status Endpoint

* edpoint
This commit is contained in:
Michael McGuinness
2025-03-04 16:20:54 +00:00
parent d91ef1832b
commit a07037b018
9 changed files with 291 additions and 134 deletions
+74 -48
View File
@@ -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
+16 -5
View File
@@ -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),
})
}
+38 -1
View File
@@ -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)
}
-22
View File
@@ -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
}
-47
View File
@@ -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)
}
+118 -3
View File
@@ -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)
+39 -2
View File
@@ -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:
+2 -4
View File
@@ -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)
}
+4 -2
View File
@@ -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)
}