2022-12-14 18:53:55 +00:00
package state
import (
"time"
"github.com/jmoiron/sqlx"
"github.com/lib/pq"
)
type txnRow struct {
2023-05-02 14:56:59 +01:00
UserID string ` db:"user_id" `
DeviceID string ` db:"device_id" `
2022-12-14 18:53:55 +00:00
EventID string ` db:"event_id" `
TxnID string ` db:"txn_id" `
Timestamp int64 ` db:"ts" `
}
type TransactionsTable struct {
db * sqlx . DB
}
func NewTransactionsTable ( db * sqlx . DB ) * TransactionsTable {
// make sure tables are made
db . MustExec ( `
CREATE TABLE IF NOT EXISTS syncv3_txns (
2023-05-10 11:22:20 +01:00
user_id TEXT NOT NULL ,
2023-05-02 14:56:59 +01:00
device_id TEXT NOT NULL ,
2022-12-14 18:53:55 +00:00
event_id TEXT NOT NULL ,
txn_id TEXT NOT NULL ,
ts BIGINT NOT NULL ,
2023-05-02 14:56:59 +01:00
UNIQUE ( user_id , device_id , event_id )
2022-12-14 18:53:55 +00:00
) ;
` )
return & TransactionsTable { db }
}
2023-05-02 14:56:59 +01:00
func ( t * TransactionsTable ) Insert ( userID , deviceID string , eventIDToTxnID map [ string ] string ) error {
2022-12-14 18:53:55 +00:00
ts := time . Now ( )
rows := make ( [ ] txnRow , 0 , len ( eventIDToTxnID ) )
for eventID , txnID := range eventIDToTxnID {
rows = append ( rows , txnRow {
EventID : eventID ,
TxnID : txnID ,
2023-05-02 14:56:59 +01:00
UserID : userID ,
2023-01-16 11:55:37 +00:00
DeviceID : deviceID ,
2022-12-14 18:53:55 +00:00
Timestamp : ts . UnixMilli ( ) ,
} )
}
result , err := t . db . NamedQuery ( `
2023-05-02 14:56:59 +01:00
INSERT INTO syncv3_txns ( user_id , device_id , event_id , txn_id , ts )
VALUES ( : user_id , : device_id , : event_id , : txn_id , : ts ) ` , rows )
2022-12-14 18:53:55 +00:00
if err == nil {
result . Close ( )
}
return err
}
func ( t * TransactionsTable ) Clean ( boundaryTime time . Time ) error {
_ , err := t . db . Exec ( ` DELETE FROM syncv3_txns WHERE ts <= $1 ` , boundaryTime . UnixMilli ( ) )
return err
}
2023-05-02 14:56:59 +01:00
func ( t * TransactionsTable ) Select ( userID , deviceID string , eventIDs [ ] string ) ( map [ string ] string , error ) {
2022-12-14 18:53:55 +00:00
result := make ( map [ string ] string , len ( eventIDs ) )
var rows [ ] txnRow
2023-05-02 14:56:59 +01:00
err := t . db . Select ( & rows , ` SELECT event_id, txn_id FROM syncv3_txns WHERE user_id=$1 AND device_id=$2 and event_id=ANY($3) ` , userID , deviceID , pq . StringArray ( eventIDs ) )
2022-12-14 18:53:55 +00:00
if err != nil {
return nil , err
}
for _ , row := range rows {
result [ row . EventID ] = row . TxnID
}
return result , nil
}