mirror of
https://github.com/mautrix/whatsapp.git
synced 2026-05-16 10:33:14 -04:00
77 lines
2.6 KiB
Go
77 lines
2.6 KiB
Go
package wadb
|
|
|
|
import (
|
|
"context"
|
|
|
|
"go.mau.fi/util/dbutil"
|
|
"maunium.net/go/mautrix/bridgev2/networkid"
|
|
)
|
|
|
|
type MediaBackfillRequestStatus int
|
|
|
|
const (
|
|
MediaBackfillRequestStatusNotRequested MediaBackfillRequestStatus = 0
|
|
MediaBackfillRequestStatusRequested MediaBackfillRequestStatus = 1
|
|
MediaBackfillRequestStatusRequestFailed MediaBackfillRequestStatus = 2
|
|
MediaBackfillRequestStatusRequestSkipped MediaBackfillRequestStatus = 3
|
|
)
|
|
|
|
type MediaRequestQuery struct {
|
|
BridgeID networkid.BridgeID
|
|
*dbutil.QueryHelper[*MediaRequest]
|
|
}
|
|
|
|
type MediaRequest struct {
|
|
BridgeID networkid.BridgeID
|
|
UserLoginID networkid.UserLoginID
|
|
MessageID networkid.MessageID
|
|
PortalKey networkid.PortalKey
|
|
MediaKey []byte
|
|
Status MediaBackfillRequestStatus
|
|
Error string
|
|
}
|
|
|
|
const (
|
|
upsertMediaRequestQuery = `
|
|
INSERT INTO whatsapp_media_backfill_request (
|
|
bridge_id, user_login_id, message_id, portal_id, portal_receiver, media_key, status, error
|
|
)
|
|
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
|
|
ON CONFLICT (bridge_id, user_login_id, message_id) DO UPDATE SET
|
|
media_key=excluded.media_key, status=excluded.status, error=excluded.error
|
|
`
|
|
deleteMediaRequestQuery = `
|
|
DELETE FROM whatsapp_media_backfill_request
|
|
WHERE bridge_id=$1 AND user_login_id=$2 AND message_id=$3
|
|
`
|
|
getAllUnrequestedMediaRequestsForUserLoginQuery = `
|
|
SELECT bridge_id, user_login_id, message_id, portal_id, portal_receiver, media_key, status, error
|
|
FROM whatsapp_media_backfill_request
|
|
WHERE bridge_id=$1 AND user_login_id=$2 AND status=0
|
|
`
|
|
)
|
|
|
|
func (mrq *MediaRequestQuery) Put(ctx context.Context, mr *MediaRequest) error {
|
|
mr.BridgeID = mrq.BridgeID
|
|
return mrq.Exec(ctx, upsertMediaRequestQuery, mr.sqlVariables()...)
|
|
}
|
|
|
|
func (mrq *MediaRequestQuery) Delete(ctx context.Context, loginID networkid.UserLoginID, messageID networkid.MessageID) error {
|
|
return mrq.Exec(ctx, deleteMediaRequestQuery, mrq.BridgeID, loginID, messageID)
|
|
}
|
|
|
|
func (mrq *MediaRequestQuery) GetUnrequestedForUserLogin(ctx context.Context, loginID networkid.UserLoginID) ([]*MediaRequest, error) {
|
|
return mrq.QueryMany(ctx, getAllUnrequestedMediaRequestsForUserLoginQuery, mrq.BridgeID, loginID)
|
|
}
|
|
|
|
func (mr *MediaRequest) Scan(row dbutil.Scannable) (*MediaRequest, error) {
|
|
err := row.Scan(&mr.BridgeID, &mr.UserLoginID, &mr.MessageID, &mr.PortalKey.ID, &mr.PortalKey.Receiver, &mr.MediaKey, &mr.Status, &mr.Error)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return mr, nil
|
|
}
|
|
|
|
func (mr *MediaRequest) sqlVariables() []any {
|
|
return []any{mr.BridgeID, mr.UserLoginID, mr.MessageID, mr.PortalKey.ID, mr.PortalKey.Receiver, mr.MediaKey, mr.Status, mr.Error}
|
|
}
|