Skip to content

Commit d89826c

Browse files
committed
Merge pull request #3 from gemsorg/delete_assignment
Delete assignment endpoint
1 parent f430718 commit d89826c

File tree

6 files changed

+104
-0
lines changed

6 files changed

+104
-0
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package assignmentdestroyer
2+
3+
import (
4+
"context"
5+
6+
"github.com/gemsorg/assignment/pkg/apierror"
7+
"github.com/gemsorg/assignment/pkg/authentication"
8+
"github.com/gemsorg/assignment/pkg/service"
9+
"github.com/go-kit/kit/endpoint"
10+
)
11+
12+
func makeAssignmentDestroyerEndpoint(svc service.AssignmentService) endpoint.Endpoint {
13+
return func(ctx context.Context, request interface{}) (interface{}, error) {
14+
data, _ := authentication.ParseAuthData(ctx)
15+
svc.SetAuthData(data)
16+
req := request.(AssignmentRequest)
17+
p, err := svc.DeleteAssignment(req.WorkerID, req.JobID)
18+
if err != nil {
19+
return AssignmentResponse{p}, errorResponse(err)
20+
}
21+
return AssignmentResponse{p}, nil
22+
}
23+
}
24+
25+
func errorResponse(err error) *apierror.APIError {
26+
return apierror.New(500, err.Error(), err)
27+
}
28+
29+
type AssignmentRequest struct {
30+
WorkerID uint64 `json:"worker_id"`
31+
JobID uint64 `json:"job_id"`
32+
}
33+
34+
type AssignmentResponse struct {
35+
Destroyed bool `json:"destroyed"`
36+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package assignmentdestroyer
2+
3+
import (
4+
"context"
5+
"encoding/json"
6+
"net/http"
7+
8+
"github.com/gemsorg/assignment/pkg/apierror"
9+
"github.com/gemsorg/assignment/pkg/service"
10+
kithttp "github.com/go-kit/kit/transport/http"
11+
)
12+
13+
func MakeHandler(s service.AssignmentService) http.Handler {
14+
return kithttp.NewServer(
15+
makeAssignmentDestroyerEndpoint(s),
16+
decodeAssignmentDestroyerRequest,
17+
encodeResponse,
18+
)
19+
}
20+
21+
func encodeResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error {
22+
w.Header().Set("Content-Type", "application/json; charset=utf-8")
23+
return json.NewEncoder(w).Encode(response)
24+
}
25+
26+
func decodeAssignmentDestroyerRequest(_ context.Context, r *http.Request) (interface{}, error) {
27+
var a AssignmentRequest
28+
decoder := json.NewDecoder(r.Body)
29+
err := decoder.Decode(&a)
30+
if err != nil {
31+
return nil, apierror.New(500, err.Error(), err)
32+
}
33+
return a, nil
34+
}

pkg/datastore/assignment.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type Storage interface {
1818
GetSettings(jobID uint64) (*assignment.Settings, error)
1919
GetWhitelist(jobID uint64, workerID uint64) (*whitelist.Whitelist, error)
2020
WorkerAlreadyAssigned(jobID uint64, workerID uint64) (bool, error)
21+
DeleteAssignment(workerID uint64, jobID uint64) (bool, error)
2122
}
2223

2324
type AssignmentStore struct {
@@ -137,3 +138,18 @@ func (as *AssignmentStore) WorkerAlreadyAssigned(jobID uint64, workerID uint64)
137138

138139
return true, nil
139140
}
141+
142+
func (as *AssignmentStore) DeleteAssignment(workerID uint64, jobID uint64) (bool, error) {
143+
result, err := as.DB.Exec("DELETE FROM assignments WHERE worker_id = ? AND job_id = ?", workerID, jobID)
144+
if err != nil {
145+
return false, err
146+
}
147+
148+
numAffected, err := result.RowsAffected()
149+
150+
if numAffected == 0 {
151+
return false, AssignmentNotFound{workerID, jobID}
152+
}
153+
154+
return true, nil
155+
}

pkg/datastore/errors.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,18 @@
11
package datastore
22

3+
import "fmt"
4+
35
type AlreadyAssigned struct{}
46

57
func (err AlreadyAssigned) Error() string {
68
return "User is already assigned a task from this job"
79
}
10+
11+
type AssignmentNotFound struct {
12+
WorkerID uint64
13+
JobID uint64
14+
}
15+
16+
func (err AssignmentNotFound) Error() string {
17+
return fmt.Sprintf("No Record found for worker_id: %d, job_id: %d", err.WorkerID, err.JobID)
18+
}

pkg/server/server.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"net/http"
55

66
"github.com/gemsorg/assignment/pkg/api/assignmentcreator"
7+
assignmentdestroyer "github.com/gemsorg/assignment/pkg/api/assignmentdestroyer/assignmentfetcher"
78
"github.com/gemsorg/assignment/pkg/api/assignmentfetcher"
89

910
"github.com/gemsorg/assignment/pkg/authentication"
@@ -25,6 +26,7 @@ func New(
2526
r.Handle("/assignments", assignmentfetcher.MakeAssignmentsFetcherHandler(s)).Methods("GET")
2627
r.Handle("/assignments/{assignment_id}", assignmentfetcher.MakeAssignmentFetcherHandler(s)).Methods("GET")
2728
r.Handle("/assignments", assignmentcreator.MakeHandler(s)).Methods("POST")
29+
r.Handle("/assignments", assignmentdestroyer.MakeHandler(s)).Methods("DELETE")
2830
r.Use(authentication.AuthMiddleware)
2931
return withHandlers(r)
3032
}

pkg/service/service.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ type AssignmentService interface {
1414
GetAssignment(id string) (*assignment.Assignment, error)
1515
CreateAssignment(assignment.NewAssignment, *assignment.Settings) (*assignment.Assignment, error)
1616
GetSettings(jobID uint64) (*assignment.Settings, error)
17+
DeleteAssignment(workerID uint64, jobID uint64) (bool, error)
1718
}
1819

1920
type service struct {
@@ -68,3 +69,7 @@ func (s *service) CreateAssignment(a assignment.NewAssignment, set *assignment.S
6869
func (s *service) GetSettings(jobID uint64) (*assignment.Settings, error) {
6970
return s.store.GetSettings(jobID)
7071
}
72+
73+
func (s *service) DeleteAssignment(workerID uint64, jobID uint64) (bool, error) {
74+
return s.store.DeleteAssignment(workerID, jobID)
75+
}

0 commit comments

Comments
 (0)