[server] Add API to re-queue item for processing (#679)

## Description

## Tests
This commit is contained in:
Neeraj Gupta 2024-03-05 15:15:23 +05:30 committed by GitHub
parent 3513d7a297
commit 34743171f9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 44 additions and 0 deletions

View file

@ -587,6 +587,7 @@ func main() {
privateAPI.POST("/storage-bonus/referral-claim", storageBonusHandler.ClaimReferral)
adminHandler := &api.AdminHandler{
QueueRepo: queueRepo,
UserRepo: userRepo,
CollectionRepo: collectionRepo,
UserAuthRepo: userAuthRepo,
@ -615,6 +616,7 @@ func main() {
adminAPI.GET("/email-hash", adminHandler.GetEmailHash)
adminAPI.POST("/emails-from-hashes", adminHandler.GetEmailsFromHashes)
adminAPI.PUT("/user/subscription", adminHandler.UpdateSubscription)
adminAPI.POST("/queue/re-queue", adminHandler.ReQueueItem)
adminAPI.POST("/user/bf-2013", adminHandler.UpdateBFDeal)
adminAPI.POST("/job/clear-orphan-objects", adminHandler.ClearOrphanObjects)

View file

@ -22,6 +22,12 @@ type AdminOpsForUserRequest struct {
UserID int64 `json:"userID" binding:"required"`
}
// ReQueueItemRequest puts an item back into the queue for processing.
type ReQueueItemRequest struct {
ID int64 `json:"id" binding:"required"`
QueueName string `json:"queueName" binding:"required"`
}
// RecoverAccount is used to recover accounts which are in soft-delete state.
type RecoverAccountRequest struct {
UserID int64 `json:"userID" binding:"required"`

View file

@ -33,6 +33,7 @@ import (
// AdminHandler exposes request handlers for all admin related requests
type AdminHandler struct {
QueueRepo *repo.QueueRepository
UserRepo *repo.UserRepository
CollectionRepo *repo.CollectionRepository
UserAuthRepo *repo.UserAuthRepository
@ -305,6 +306,24 @@ func (h *AdminHandler) UpdateSubscription(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{})
}
func (h *AdminHandler) ReQueueItem(c *gin.Context) {
var r ente.ReQueueItemRequest
if err := c.ShouldBindJSON(&r); err != nil {
handler.Error(c, stacktrace.Propagate(ente.ErrBadRequest, "Bad request"))
return
}
adminID := auth.GetUserID(c.Request.Header)
go h.DiscordController.NotifyAdminAction(
fmt.Sprintf("Admin (%d) requeueing item %d for queue: %s", adminID, r.ID, r.QueueName))
err := h.QueueRepo.RequeueItem(c, r.QueueName, r.ID)
if err != nil {
logrus.WithError(err).Error("Failed to re-queue item")
handler.Error(c, stacktrace.Propagate(err, ""))
return
}
c.JSON(http.StatusOK, gin.H{})
}
func (h *AdminHandler) UpdateBFDeal(c *gin.Context) {
var r ente.UpdateBlackFridayDeal
if err := c.ShouldBindJSON(&r); err != nil {

View file

@ -4,6 +4,7 @@ import (
"context"
"database/sql"
"fmt"
"github.com/sirupsen/logrus"
"strconv"
"strings"
@ -70,6 +71,22 @@ func (repo *QueueRepository) UpdateItem(ctx context.Context, queueName string, q
return nil
}
func (repo *QueueRepository) RequeueItem(ctx context.Context, queueName string, queueID int64) error {
rows, err := repo.DB.ExecContext(ctx, `UPDATE queue SET is_deleted = false WHERE queue_name = $1 AND queue_id = $2`, queueName, queueID)
if err != nil {
return stacktrace.Propagate(err, "")
}
count, err := rows.RowsAffected()
if err != nil {
return stacktrace.Propagate(err, "")
}
if count == 0 {
return fmt.Errorf("no item found with queueID: %d for queue %s", queueID, queueName)
}
logrus.Info("Re-queued %d item with queueID: %d for queue %s", count, queueID, queueName)
return nil
}
// AddItems adds a list of item against a specified queue
func (repo *QueueRepository) AddItems(ctx context.Context, tx *sql.Tx, queueName string, items []string) error {
if len(items) == 0 {