SimpleCloudNotifier/scnserver/db/impl/primary/deliveries.go

156 lines
4.3 KiB
Go
Raw Normal View History

package primary
import (
2022-11-20 15:40:19 +01:00
scn "blackforestbytes.com/simplecloudnotifier"
"blackforestbytes.com/simplecloudnotifier/db"
"blackforestbytes.com/simplecloudnotifier/models"
"gogs.mikescher.com/BlackForestBytes/goext/langext"
"gogs.mikescher.com/BlackForestBytes/goext/rfctime"
"gogs.mikescher.com/BlackForestBytes/goext/sq"
"time"
)
func (db *Database) CreateRetryDelivery(ctx db.TxContext, client models.Client, msg models.Message) (models.Delivery, error) {
tx, err := ctx.GetOrCreateTransaction(db)
if err != nil {
return models.Delivery{}, err
}
2023-05-28 22:27:38 +02:00
now := time.Now()
2022-11-20 15:40:19 +01:00
next := scn.NextDeliveryTimestamp(now)
entity := models.Delivery{
2023-05-28 22:27:38 +02:00
DeliveryID: models.NewDeliveryID(),
MessageID: msg.MessageID,
ReceiverUserID: client.UserID,
ReceiverClientID: client.ClientID,
TimestampCreated: models.NewSCNTime(now),
TimestampFinalized: nil,
Status: models.DeliveryStatusRetry,
RetryCount: 0,
NextDelivery: rfctime.NewRFC3339NanoPtr(&next),
FCMMessageID: nil,
2023-05-28 22:27:38 +02:00
}
2023-05-28 22:27:38 +02:00
_, err = sq.InsertSingle(ctx, tx, "deliveries", entity)
if err != nil {
return models.Delivery{}, err
}
return entity, nil
2023-05-28 22:27:38 +02:00
}
func (db *Database) CreateSuccessDelivery(ctx db.TxContext, client models.Client, msg models.Message, fcmDelivID string) (models.Delivery, error) {
2023-05-28 22:27:38 +02:00
tx, err := ctx.GetOrCreateTransaction(db)
if err != nil {
return models.Delivery{}, err
}
2023-05-28 22:27:38 +02:00
now := time.Now()
entity := models.Delivery{
2023-05-28 22:27:38 +02:00
DeliveryID: models.NewDeliveryID(),
MessageID: msg.MessageID,
ReceiverUserID: client.UserID,
ReceiverClientID: client.ClientID,
TimestampCreated: models.NewSCNTime(now),
TimestampFinalized: models.NewSCNTimePtr(&now),
Status: models.DeliveryStatusSuccess,
RetryCount: 0,
NextDelivery: nil,
FCMMessageID: langext.Ptr(fcmDelivID),
2023-05-28 22:27:38 +02:00
}
_, err = sq.InsertSingle(ctx, tx, "deliveries", entity)
if err != nil {
return models.Delivery{}, err
}
return entity, nil
}
2022-11-20 15:40:19 +01:00
func (db *Database) ListRetrieableDeliveries(ctx db.TxContext, pageSize int) ([]models.Delivery, error) {
2022-11-20 15:40:19 +01:00
tx, err := ctx.GetOrCreateTransaction(db)
if err != nil {
return nil, err
}
return sq.QueryAll[models.Delivery](ctx, tx, "SELECT * FROM deliveries WHERE status = 'RETRY' AND next_delivery < :next ORDER BY next_delivery ASC LIMIT :lim", sq.PP{
"next": time.Now().Format(time.RFC3339Nano),
"lim": pageSize,
}, sq.SModeExtended, sq.Safe)
2022-11-20 15:40:19 +01:00
}
func (db *Database) SetDeliverySuccess(ctx db.TxContext, delivery models.Delivery, fcmDelivID string) error {
2022-11-20 15:40:19 +01:00
tx, err := ctx.GetOrCreateTransaction(db)
if err != nil {
return err
}
_, err = tx.Exec(ctx, "UPDATE deliveries SET status = 'SUCCESS', next_delivery = NULL, retry_count = :rc, timestamp_finalized = :ts, fcm_message_id = :fcm WHERE delivery_id = :did", sq.PP{
"rc": delivery.RetryCount + 1,
"ts": time2DB(time.Now()),
"fcm": fcmDelivID,
"did": delivery.DeliveryID,
})
2022-11-20 15:40:19 +01:00
if err != nil {
return err
}
return nil
}
func (db *Database) SetDeliveryFailed(ctx db.TxContext, delivery models.Delivery) error {
2022-11-20 15:40:19 +01:00
tx, err := ctx.GetOrCreateTransaction(db)
if err != nil {
return err
}
_, err = tx.Exec(ctx, "UPDATE deliveries SET status = 'FAILED', next_delivery = NULL, retry_count = :rc, timestamp_finalized = :ts WHERE delivery_id = :did",
sq.PP{
"rc": delivery.RetryCount + 1,
"ts": time2DB(time.Now()),
"did": delivery.DeliveryID,
})
2022-11-20 15:40:19 +01:00
if err != nil {
return err
}
return nil
}
func (db *Database) SetDeliveryRetry(ctx db.TxContext, delivery models.Delivery) error {
2022-11-20 15:40:19 +01:00
tx, err := ctx.GetOrCreateTransaction(db)
if err != nil {
return err
}
_, err = tx.Exec(ctx, "UPDATE deliveries SET status = 'RETRY', next_delivery = :next, retry_count = :rc WHERE delivery_id = :did", sq.PP{
"next": scn.NextDeliveryTimestamp(time.Now()).Format(time.RFC3339Nano),
"rc": delivery.RetryCount + 1,
"did": delivery.DeliveryID,
})
2022-11-20 15:40:19 +01:00
if err != nil {
return err
}
return nil
}
func (db *Database) CancelPendingDeliveries(ctx db.TxContext, messageID models.MessageID) error {
2022-11-20 15:40:19 +01:00
tx, err := ctx.GetOrCreateTransaction(db)
if err != nil {
return err
}
_, err = tx.Exec(ctx, "UPDATE deliveries SET status = 'FAILED', next_delivery = NULL, timestamp_finalized = :ts WHERE message_id = :mid AND status = 'RETRY'", sq.PP{
"ts": time.Now(),
"mid": messageID,
})
2022-11-20 15:40:19 +01:00
if err != nil {
return err
}
return nil
}