mirror of
https://github.com/tulir/mautrix-whatsapp
synced 2024-11-14 22:11:57 +01:00
103bfc31c6
* Bump minimum Go version to 1.21 * Add contexts everywhere * Switch database code to new dbutil patterns * Finish switching away from maulogger
94 lines
3 KiB
Go
94 lines
3 KiB
Go
// mautrix-whatsapp - A Matrix-WhatsApp puppeting bridge.
|
|
// Copyright (C) 2024 Tulir Asokan, Sumner Evans
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Affero General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Affero General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
package database
|
|
|
|
import (
|
|
"context"
|
|
|
|
"go.mau.fi/util/dbutil"
|
|
"maunium.net/go/mautrix/id"
|
|
)
|
|
|
|
type BackfillStateQuery struct {
|
|
*dbutil.QueryHelper[*BackfillState]
|
|
}
|
|
|
|
func newBackfillState(qh *dbutil.QueryHelper[*BackfillState]) *BackfillState {
|
|
return &BackfillState{qh: qh}
|
|
}
|
|
|
|
func (bq *BackfillStateQuery) NewBackfillState(userID id.UserID, portalKey PortalKey) *BackfillState {
|
|
return &BackfillState{
|
|
qh: bq.QueryHelper,
|
|
|
|
UserID: userID,
|
|
Portal: portalKey,
|
|
}
|
|
}
|
|
|
|
const (
|
|
getBackfillStateQuery = `
|
|
SELECT user_mxid, portal_jid, portal_receiver, processing_batch, backfill_complete, first_expected_ts
|
|
FROM backfill_state
|
|
WHERE user_mxid=$1
|
|
AND portal_jid=$2
|
|
AND portal_receiver=$3
|
|
`
|
|
upsertBackfillStateQuery = `
|
|
INSERT INTO backfill_state
|
|
(user_mxid, portal_jid, portal_receiver, processing_batch, backfill_complete, first_expected_ts)
|
|
VALUES ($1, $2, $3, $4, $5, $6)
|
|
ON CONFLICT (user_mxid, portal_jid, portal_receiver)
|
|
DO UPDATE SET
|
|
processing_batch=EXCLUDED.processing_batch,
|
|
backfill_complete=EXCLUDED.backfill_complete,
|
|
first_expected_ts=EXCLUDED.first_expected_ts
|
|
`
|
|
)
|
|
|
|
func (bq *BackfillStateQuery) GetBackfillState(ctx context.Context, userID id.UserID, portalKey PortalKey) (*BackfillState, error) {
|
|
return bq.QueryOne(ctx, getBackfillStateQuery, userID, portalKey.JID, portalKey.Receiver)
|
|
}
|
|
|
|
type BackfillState struct {
|
|
qh *dbutil.QueryHelper[*BackfillState]
|
|
|
|
UserID id.UserID
|
|
Portal PortalKey
|
|
ProcessingBatch bool
|
|
BackfillComplete bool
|
|
FirstExpectedTimestamp uint64
|
|
}
|
|
|
|
func (b *BackfillState) Scan(row dbutil.Scannable) (*BackfillState, error) {
|
|
return dbutil.ValueOrErr(b, row.Scan(
|
|
&b.UserID, &b.Portal.JID, &b.Portal.Receiver, &b.ProcessingBatch, &b.BackfillComplete, &b.FirstExpectedTimestamp,
|
|
))
|
|
}
|
|
|
|
func (b *BackfillState) sqlVariables() []any {
|
|
return []any{b.UserID, b.Portal.JID, b.Portal.Receiver, b.ProcessingBatch, b.BackfillComplete, b.FirstExpectedTimestamp}
|
|
}
|
|
|
|
func (b *BackfillState) Upsert(ctx context.Context) error {
|
|
return b.qh.Exec(ctx, upsertBackfillStateQuery, b.sqlVariables()...)
|
|
}
|
|
|
|
func (b *BackfillState) SetProcessingBatch(ctx context.Context, processing bool) error {
|
|
b.ProcessingBatch = processing
|
|
return b.Upsert(ctx)
|
|
}
|