feat(t206): connect Android procurement tasks
This commit is contained in:
@@ -498,13 +498,12 @@ func (s *Store) HeartbeatTask(
|
||||
if err != nil {
|
||||
return usecase.TaskHeartbeatRepositoryResult{}, err
|
||||
}
|
||||
if err := validateClaim(
|
||||
if err := validateClaimOwner(
|
||||
task,
|
||||
request.UserID,
|
||||
request.DeviceID,
|
||||
request.ClaimGeneration,
|
||||
request.ClaimTokenHash,
|
||||
request.Now,
|
||||
); err != nil {
|
||||
return usecase.TaskHeartbeatRepositoryResult{}, err
|
||||
}
|
||||
@@ -512,6 +511,11 @@ func (s *Store) HeartbeatTask(
|
||||
return usecase.TaskHeartbeatRepositoryResult{},
|
||||
usecase.ErrTaskStateConflict
|
||||
}
|
||||
expired := !task.ClaimExpiresAt.After(request.Now)
|
||||
if expired && request.Step != "SAFE_STOPPED" {
|
||||
return usecase.TaskHeartbeatRepositoryResult{},
|
||||
usecase.ErrClaimExpired
|
||||
}
|
||||
execution, err := getExecutionByID(ctx, tx, request.ExecutionID)
|
||||
if err != nil {
|
||||
return usecase.TaskHeartbeatRepositoryResult{}, err
|
||||
@@ -525,7 +529,8 @@ func (s *Store) HeartbeatTask(
|
||||
usecase.ErrExecutionMismatch
|
||||
}
|
||||
expiresAt := *task.ClaimExpiresAt
|
||||
if request.MinimumExpiry.After(expiresAt) {
|
||||
if !expired &&
|
||||
request.MinimumExpiry.After(expiresAt) {
|
||||
expiresAt = request.MinimumExpiry
|
||||
}
|
||||
result, err := tx.ExecContext(
|
||||
@@ -561,8 +566,7 @@ func (s *Store) HeartbeatTask(
|
||||
AND claimed_by_user_id = ?
|
||||
AND claimed_by_device_id = ?
|
||||
AND claim_generation = ?
|
||||
AND claim_token_hash = ?
|
||||
AND claim_expires_at > ?`,
|
||||
AND claim_token_hash = ?`,
|
||||
formatTimestamp(expiresAt),
|
||||
formatTimestamp(request.Now),
|
||||
request.TaskID,
|
||||
@@ -570,7 +574,6 @@ func (s *Store) HeartbeatTask(
|
||||
request.DeviceID,
|
||||
request.ClaimGeneration,
|
||||
request.ClaimTokenHash,
|
||||
formatTimestamp(request.Now),
|
||||
)
|
||||
if err != nil {
|
||||
return usecase.TaskHeartbeatRepositoryResult{}, repositoryFailure(err)
|
||||
@@ -581,7 +584,7 @@ func (s *Store) HeartbeatTask(
|
||||
}
|
||||
if affected != 1 {
|
||||
return usecase.TaskHeartbeatRepositoryResult{},
|
||||
usecase.ErrClaimExpired
|
||||
usecase.ErrTaskVersionConflict
|
||||
}
|
||||
_, err = tx.ExecContext(
|
||||
ctx,
|
||||
@@ -797,13 +800,12 @@ func (s *Store) AcknowledgeTaskCancellation(
|
||||
if err != nil {
|
||||
return domain.PurchaseTask{}, false, err
|
||||
}
|
||||
if err := validateClaim(
|
||||
if err := validateClaimOwner(
|
||||
task,
|
||||
request.UserID,
|
||||
request.DeviceID,
|
||||
request.ClaimGeneration,
|
||||
request.ClaimTokenHash,
|
||||
request.Now,
|
||||
); err != nil {
|
||||
return domain.PurchaseTask{}, false, err
|
||||
}
|
||||
@@ -846,8 +848,7 @@ func (s *Store) AcknowledgeTaskCancellation(
|
||||
AND claimed_by_user_id = ?
|
||||
AND claimed_by_device_id = ?
|
||||
AND claim_generation = ?
|
||||
AND claim_token_hash = ?
|
||||
AND claim_expires_at > ?`,
|
||||
AND claim_token_hash = ?`,
|
||||
formatTimestamp(request.Now),
|
||||
formatTimestamp(request.Now),
|
||||
request.TaskID,
|
||||
@@ -856,7 +857,6 @@ func (s *Store) AcknowledgeTaskCancellation(
|
||||
request.DeviceID,
|
||||
request.ClaimGeneration,
|
||||
request.ClaimTokenHash,
|
||||
formatTimestamp(request.Now),
|
||||
)
|
||||
if err != nil {
|
||||
return domain.PurchaseTask{}, false, repositoryFailure(err)
|
||||
@@ -1041,6 +1041,28 @@ func validateClaim(
|
||||
generation int64,
|
||||
tokenHash string,
|
||||
now time.Time,
|
||||
) error {
|
||||
if err := validateClaimOwner(
|
||||
task,
|
||||
userID,
|
||||
deviceID,
|
||||
generation,
|
||||
tokenHash,
|
||||
); err != nil {
|
||||
return err
|
||||
}
|
||||
if task.ClaimExpiresAt == nil || !task.ClaimExpiresAt.After(now) {
|
||||
return usecase.ErrClaimExpired
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateClaimOwner(
|
||||
task domain.PurchaseTask,
|
||||
userID string,
|
||||
deviceID string,
|
||||
generation int64,
|
||||
tokenHash string,
|
||||
) error {
|
||||
if task.ClaimedByUserID == nil ||
|
||||
*task.ClaimedByUserID != userID ||
|
||||
@@ -1051,7 +1073,7 @@ func validateClaim(
|
||||
*task.ClaimTokenHash != tokenHash {
|
||||
return usecase.ErrClaimInvalid
|
||||
}
|
||||
if task.ClaimExpiresAt == nil || !task.ClaimExpiresAt.After(now) {
|
||||
if task.ClaimExpiresAt == nil {
|
||||
return usecase.ErrClaimExpired
|
||||
}
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user