Skip to content

Commit b075861

Browse files
committed
Get task from task service if worker allowed before assignment creation
1 parent 18d1b4f commit b075861

File tree

11 files changed

+132
-14
lines changed

11 files changed

+132
-14
lines changed

pkg/api/assignmentcreator/endpoint.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"github.com/gemsorg/assignment/pkg/apierror"
77
"github.com/gemsorg/assignment/pkg/assignment"
88
"github.com/gemsorg/assignment/pkg/authentication"
9+
ds "github.com/gemsorg/assignment/pkg/datastore"
910
"github.com/gemsorg/assignment/pkg/service"
1011
"github.com/go-kit/kit/endpoint"
1112
)
@@ -17,7 +18,9 @@ func makeAssignmentCreatorEndpoint(svc service.AssignmentService) endpoint.Endpo
1718
req := request.(assignment.NewAssignment)
1819
settings, err := svc.GetSettings(req.JobID)
1920
if err != nil {
20-
return nil, errorResponse(err)
21+
if _, ok := err.(ds.NoRowErr); !ok {
22+
return nil, errorResponse(err)
23+
}
2124
}
2225

2326
saved, err := svc.CreateAssignment(req, settings)

pkg/assignment/assignment.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ type NewAssignment struct {
2828
JobID uint64 `json:"job_id"`
2929
TaskID uint64 `json:"task_id"`
3030
WorkerID uint64 `json:"worker_id"`
31-
WorkerAssignmentCount int `json:"worker_assignment_count"`
31+
WorkerAssignmentCount int // This comes internally from this service
3232
OnboardingSuccess bool `json:"onboarding_success"`
3333
WorkerAlreadyResponded bool `json:"worker_already_responded"`
3434
WorkerAlreadyAssigned bool // This comes internally from this service

pkg/authentication/authentication.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ type AuthData struct {
2121
Expiration int64
2222
Issuer string
2323
UserID uint64
24+
Token string
2425
}
2526

2627
func ParseAuthData(ctx context.Context) (AuthData, error) {
@@ -37,9 +38,10 @@ func ParseAuthData(ctx context.Context) (AuthData, error) {
3738
}
3839

3940
return AuthData{
40-
int64(claims[ExpirationKey].(float64)),
41-
claims[IssuerKey].(string),
42-
uint64(claims[UserIDKey].(float64)),
41+
Expiration: int64(claims[ExpirationKey].(float64)),
42+
Issuer: claims[IssuerKey].(string),
43+
UserID: uint64(claims[UserIDKey].(float64)),
44+
Token: tokenString,
4345
}, nil
4446
}
4547

pkg/authentication/authentication_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func TestParseAuthData(t *testing.T) {
4343
{
4444
"it returns auth data",
4545
args{ctx},
46-
AuthData{1591960106, "http://localhost:3000", 1},
46+
AuthData{1591960106, "http://localhost:3000", 1, "abc"},
4747
false,
4848
},
4949
}

pkg/authorization/authorization.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
type Authorizer interface {
1111
SetAuthData(data authentication.AuthData)
1212
IsModerator() (bool, error)
13+
GetAuthToken() string
1314
}
1415

1516
type authorizor struct {
@@ -33,3 +34,7 @@ func (a *authorizor) IsModerator() (bool, error) {
3334
}
3435
return true, nil
3536
}
37+
38+
func (a *authorizor) GetAuthToken() string {
39+
return a.authData.Token
40+
}

pkg/authorization/authorization_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func TestNewAuthorizer(t *testing.T) {
2727
}
2828

2929
func TestSetAuthData(t *testing.T) {
30-
authData := authentication.AuthData{1591960106, "http://localhost:3000", 8}
30+
authData := authentication.AuthData{1591960106, "http://localhost:3000", 8, "abc"}
3131
type fields struct {
3232
authData authentication.AuthData
3333
}

pkg/datastore/assignment.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func (as *AssignmentStore) GetAssignment(id string) (*assignment.Assignment, err
7979

8080
func (as *AssignmentStore) CreateAssignment(a assignment.NewAssignment) (*assignment.Assignment, error) {
8181
result, err := as.DB.Exec(
82-
"INSERT INTO assignments (job_id, task_id, worker_id) VALUES (?,?,?)",
82+
"INSERT INTO assignments (job_id, task_id, worker_id, expires_at) VALUES (?,?,?, DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 2 HOUR))",
8383
a.JobID, a.TaskID, a.WorkerID)
8484

8585
if err != nil {
@@ -108,14 +108,18 @@ func (as *AssignmentStore) CreateAssignment(a assignment.NewAssignment) (*assign
108108
}
109109

110110
func (as *AssignmentStore) GetSettings(jobID uint64) (*assignment.Settings, error) {
111-
set := &assignment.Settings{}
112-
err := as.DB.Get(set, "SELECT * FROM settings WHERE job_id = ?", jobID)
111+
set := []*assignment.Settings{}
112+
err := as.DB.Select(&set, "SELECT * FROM settings WHERE job_id = ?", jobID)
113113

114114
if err != nil {
115115
return nil, err
116116
}
117117

118-
return set, nil
118+
if len(set) == 0 {
119+
return nil, NoRowErr{}
120+
}
121+
122+
return set[0], nil
119123
}
120124

121125
func (as *AssignmentStore) GetWhitelist(jobID uint64, workerID uint64) (*whitelist.Whitelist, error) {

pkg/datastore/errors.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,9 @@ type AssignmentNotFound struct {
1616
func (err AssignmentNotFound) Error() string {
1717
return fmt.Sprintf("No Record found for worker_id: %d, job_id: %d", err.WorkerID, err.JobID)
1818
}
19+
20+
type NoRowErr struct{}
21+
22+
func (err NoRowErr) Error() string {
23+
return "Query returned no rows"
24+
}

pkg/service/service.go

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"github.com/gemsorg/assignment/pkg/authentication"
66
"github.com/gemsorg/assignment/pkg/authorization"
77
"github.com/gemsorg/assignment/pkg/datastore"
8+
"github.com/gemsorg/assignment/pkg/tasksvc"
89
)
910

1011
type AssignmentService interface {
@@ -47,22 +48,37 @@ func (s *service) GetAssignment(id string) (*assignment.Assignment, error) {
4748
}
4849

4950
func (s *service) CreateAssignment(a assignment.NewAssignment, set *assignment.Settings) (*assignment.Assignment, error) {
51+
if set == nil {
52+
return s.store.CreateAssignment(a)
53+
}
5054
// if job has a whitelist, check if worker is part of it
5155
if set.Whitelist {
5256
wl, err := s.store.GetWhitelist(a.JobID, a.WorkerID)
5357
if wl == nil || err != nil {
5458
return nil, assignment.WorkerNotWhitelisted{}
5559
}
5660
}
61+
62+
// Get worker's assignment for this job
63+
assigned, err := s.store.WorkerAlreadyAssigned(a.JobID, a.WorkerID)
64+
a.WorkerAlreadyAssigned = assigned
65+
5766
// Check if the assignment is allowed
5867
allowed, err := a.IsAllowed(set)
5968
if !allowed {
6069
return nil, err
6170
}
6271

63-
// Get worker's assignment for this job
64-
assigned, err := s.store.WorkerAlreadyAssigned(a.JobID, a.WorkerID)
65-
a.WorkerAlreadyAssigned = assigned
72+
// Get a task from the task service
73+
params := tasksvc.SearchParams{
74+
Random: true,
75+
}
76+
result, err := tasksvc.Search(a.JobID, s.authorizor.GetAuthToken(), params)
77+
78+
if err != nil {
79+
return nil, err
80+
}
81+
a.TaskID = result.ID
6682

6783
return s.store.CreateAssignment(a)
6884
}

pkg/tasksvc/errors.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package tasksvc
2+
3+
import "fmt"
4+
5+
type NoAvailableTasks struct {
6+
JobID uint64
7+
}
8+
9+
func (err NoAvailableTasks) Error() string {
10+
return fmt.Sprintf("No available tasks for job: %d", err.JobID)
11+
}

0 commit comments

Comments
 (0)