From 0e5855afeaf00609d35b6443cd3eabd35e8af9ac Mon Sep 17 00:00:00 2001 From: Tulir Asokan Date: Fri, 29 Dec 2023 20:28:32 +0100 Subject: [PATCH] Fix things --- database/message.go | 2 +- database/upgrades/16-refactor-postgres.sql | 14 ++++++++++++- database/upgrades/17-refactor-sqlite.sql | 2 +- database/user.go | 24 +++++++++++----------- go.mod | 10 ++++----- go.sum | 22 ++++++++++---------- go.work.sum | 6 ++++++ 7 files changed, 49 insertions(+), 31 deletions(-) diff --git a/database/message.go b/database/message.go index 9914a270..777a9bb5 100644 --- a/database/message.go +++ b/database/message.go @@ -38,7 +38,7 @@ const ( ` getMessagePartBySignalIDWithUnknownReceiverQuery = ` SELECT sender, timestamp, part_index, signal_chat_id, signal_receiver, mxid, mx_room FROM message - WHERE sender=$1 AND timestamp=$2 AND part_index=$3 AND (signal_receiver=$4 OR signal_receiver='') + WHERE sender=$1 AND timestamp=$2 AND part_index=$3 AND (signal_receiver=$4 OR signal_receiver='00000000-0000-0000-0000-000000000000') ` getLastMessagePartBySignalIDQuery = ` SELECT sender, timestamp, part_index, signal_chat_id, signal_receiver, mxid, mx_room FROM message diff --git a/database/upgrades/16-refactor-postgres.sql b/database/upgrades/16-refactor-postgres.sql index 4b46d163..e1bb17e9 100644 --- a/database/upgrades/16-refactor-postgres.sql +++ b/database/upgrades/16-refactor-postgres.sql @@ -43,11 +43,23 @@ INSERT INTO lost_portals SELECT mxid, chat_id, receiver FROM portal WHERE mxid<> UPDATE portal SET mxid=NULL WHERE mxid=''; ALTER TABLE portal ADD CONSTRAINT portal_mxid_unique UNIQUE(mxid); -- Delete any portals that aren't associated with logged-in users. -DELETE FROM portal WHERE receiver NOT IN (SELECT username FROM "user" WHERE uuid<>''); +DELETE FROM portal WHERE receiver<>'' AND receiver NOT IN (SELECT username FROM "user" WHERE uuid IS NOT NULL); -- Change receiver to uuid instead of phone number, also add nil uuid for groups. UPDATE portal SET receiver=(SELECT uuid FROM "user" WHERE username=receiver) WHERE receiver<>''; UPDATE portal SET receiver='00000000-0000-0000-0000-000000000000' WHERE receiver=''; +-- Drop the foreign keys again to allow changing types (the ON UPDATE CASCADEs are needed for the above step) +ALTER TABLE message DROP CONSTRAINT message_portal_fkey; +ALTER TABLE reaction DROP CONSTRAINT reaction_message_fkey; ALTER TABLE portal ALTER COLUMN receiver TYPE uuid USING receiver::uuid; +ALTER TABLE message ALTER COLUMN signal_receiver TYPE uuid USING signal_receiver::uuid; +ALTER TABLE reaction ALTER COLUMN signal_receiver TYPE uuid USING signal_receiver::uuid; +-- Re-add the dropped constraints again +ALTER TABLE message ADD CONSTRAINT message_portal_fkey + FOREIGN KEY (signal_chat_id, signal_receiver) + REFERENCES portal (chat_id, receiver) + ON DELETE CASCADE ON UPDATE CASCADE; +ALTER TABLE reaction ADD CONSTRAINT reaction_message_fkey FOREIGN KEY (msg_author, msg_timestamp, _part_index, signal_receiver) + REFERENCES message (sender, timestamp, part_index, signal_receiver) ON DELETE CASCADE ON UPDATE CASCADE; -- Delete group v1 portal entries DELETE FROM portal WHERE chat_id NOT LIKE '________-____-____-____-____________' AND LENGTH(chat_id) <> 44; DELETE FROM lost_portals WHERE mxid IN (SELECT mxid FROM portal WHERE mxid<>''); diff --git a/database/upgrades/17-refactor-sqlite.sql b/database/upgrades/17-refactor-sqlite.sql index 4bdd1402..1e736fe2 100644 --- a/database/upgrades/17-refactor-sqlite.sql +++ b/database/upgrades/17-refactor-sqlite.sql @@ -87,7 +87,7 @@ CREATE TABLE lost_portals ( receiver TEXT ); INSERT INTO lost_portals SELECT mxid, chat_id, receiver FROM portal WHERE mxid<>''; -DELETE FROM portal WHERE receiver NOT IN (SELECT username FROM "user" WHERE uuid<>''); +DELETE FROM portal WHERE receiver<>'' AND receiver NOT IN (SELECT username FROM "user" WHERE uuid<>''); UPDATE portal SET receiver=(SELECT uuid FROM "user" WHERE username=receiver) WHERE receiver<>''; UPDATE portal SET receiver='00000000-0000-0000-0000-000000000000' WHERE receiver=''; DELETE FROM portal WHERE chat_id NOT LIKE '________-____-____-____-____________' AND LENGTH(chat_id) <> 44; diff --git a/database/user.go b/database/user.go index a97cf852..af66e301 100644 --- a/database/user.go +++ b/database/user.go @@ -27,10 +27,12 @@ import ( ) const ( - getUserByMXIDQuery = `SELECT mxid, username, uuid, management_room FROM "user" WHERE mxid=$1` - getUserByPhoneQuery = `SELECT mxid, username, uuid, management_room FROM "user" WHERE username=$1` - getUserByUUIDQuery = `SELECT mxid, username, uuid, management_room FROM "user" WHERE uuid=$1` - getAllLoggedInusersQuery = `SELECT mxid, username, uuid, management_room FROM "user" WHERE username IS NOT NULL` + getUserByMXIDQuery = `SELECT mxid, phone, uuid, management_room FROM "user" WHERE mxid=$1` + getUserByPhoneQuery = `SELECT mxid, phone, uuid, management_room FROM "user" WHERE phone=$1` + getUserByUUIDQuery = `SELECT mxid, phone, uuid, management_room FROM "user" WHERE uuid=$1` + getAllLoggedInUsersQuery = `SELECT mxid, phone, uuid, management_room FROM "user" WHERE phone IS NOT NULL` + insertUserQuery = `INSERT INTO "user" (mxid, phone, uuid, management_room) VALUES ($1, $2, $3, $4)` + updateUserQuery = `UPDATE "user" SET phone=$2, uuid=$3, management_room=$4 WHERE mxid=$1` ) type UserQuery struct { @@ -63,7 +65,7 @@ func (uq *UserQuery) GetBySignalID(ctx context.Context, uuid uuid.UUID) (*User, } func (uq *UserQuery) GetAllLoggedIn(ctx context.Context) ([]*User, error) { - return uq.QueryMany(ctx, getAllLoggedInusersQuery) + return uq.QueryMany(ctx, getAllLoggedInUsersQuery) } func (u *User) sqlVariables() []any { @@ -74,28 +76,26 @@ func (u *User) sqlVariables() []any { } func (u *User) Insert(ctx context.Context) error { - q := `INSERT INTO "user" (mxid, username, uuid, management_room) VALUES ($1, $2, $3, $4)` - return u.qh.Exec(ctx, q, u.sqlVariables()...) + return u.qh.Exec(ctx, insertUserQuery, u.sqlVariables()...) } func (u *User) Update(ctx context.Context) error { - q := `UPDATE "user" SET username=$2, uuid=$3, management_room=$4 WHERE mxid=$1` - return u.qh.Exec(ctx, q, u.sqlVariables()...) + return u.qh.Exec(ctx, updateUserQuery, u.sqlVariables()...) } func (u *User) Scan(row dbutil.Scannable) (*User, error) { - var username, managementRoom sql.NullString + var phone, managementRoom sql.NullString var signalID uuid.NullUUID err := row.Scan( &u.MXID, - &username, + &phone, &signalID, &u.ManagementRoom, ) if err != nil { return nil, err } - u.SignalUsername = username.String + u.SignalUsername = phone.String u.SignalID = signalID.UUID u.ManagementRoom = id.RoomID(managementRoom.String) return u, nil diff --git a/go.mod b/go.mod index 5b961344..ba633bda 100644 --- a/go.mod +++ b/go.mod @@ -12,14 +12,14 @@ require ( github.com/samber/lo v1.39.0 github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e github.com/stretchr/testify v1.8.4 - go.mau.fi/util v0.2.2-0.20231223205710-79ab7f6dc640 + go.mau.fi/util v0.2.2-0.20231229201527-e01ca03301e9 go.mau.fi/webp v0.1.0 - golang.org/x/exp v0.0.0-20231219180239-dc181d75b848 + golang.org/x/exp v0.0.0-20231226003508-02704c960a9b golang.org/x/image v0.14.0 - golang.org/x/net v0.18.0 + golang.org/x/net v0.19.0 google.golang.org/protobuf v1.31.0 maunium.net/go/maulogger/v2 v2.4.1 - maunium.net/go/mautrix v0.16.3-0.20231219134117-a27bf782f377 + maunium.net/go/mautrix v0.16.3-0.20231229201657-a21e5a272625 ) require ( @@ -44,7 +44,7 @@ require ( github.com/tidwall/sjson v1.2.5 // indirect github.com/yuin/goldmark v1.6.0 // indirect go.mau.fi/zeroconfig v0.1.2 // indirect - golang.org/x/crypto v0.16.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/sys v0.15.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index b9ad17ec..68c14247 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,4 @@ -github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= +github.com/DATA-DOG/go-sqlmock v1.5.1 h1:FK6RCIUSfmbnI/imIICmboyQBkOckutaa6R5YYlLZyo= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= @@ -69,20 +69,20 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/yuin/goldmark v1.6.0 h1:boZcn2GTjpsynOsC0iJHnBWa4Bi0qzfJjthwauItG68= github.com/yuin/goldmark v1.6.0/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.mau.fi/util v0.2.2-0.20231223205710-79ab7f6dc640 h1:VZasbUaoHHdZWlqXpBE0kvOCnAnr2m24JcQ4sZRpYzo= -go.mau.fi/util v0.2.2-0.20231223205710-79ab7f6dc640/go.mod h1:tiBX6nxVSOjU89jVQ7wBh3P8KjM26Lv1k7/I5QdSvBw= +go.mau.fi/util v0.2.2-0.20231229201527-e01ca03301e9 h1:sYi2qn5XYnWyHjzBj04/ZeyqMMK31qPM1l2v7aWeiA0= +go.mau.fi/util v0.2.2-0.20231229201527-e01ca03301e9/go.mod h1:9dGsBCCbZJstx16YgnVMVi3O2bOizELoKpugLD4FoGs= go.mau.fi/webp v0.1.0 h1:BHObH/DcFntT9KYun5pDr0Ot4eUZO8k2C7eP7vF4ueA= go.mau.fi/webp v0.1.0/go.mod h1:e42Z+VMFrUMS9cpEwGRIor+lQWO8oUAyPyMtcL+NMt8= go.mau.fi/zeroconfig v0.1.2 h1:DKOydWnhPMn65GbXZOafgkPm11BvFashZWLct0dGFto= go.mau.fi/zeroconfig v0.1.2/go.mod h1:NcSJkf180JT+1IId76PcMuLTNa1CzsFFZ0nBygIQM70= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/exp v0.0.0-20231219180239-dc181d75b848 h1:+iq7lrkxmFNBM7xx+Rae2W6uyPfhPeDWD+n+JgppptE= -golang.org/x/exp v0.0.0-20231219180239-dc181d75b848/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/exp v0.0.0-20231226003508-02704c960a9b h1:kLiC65FbiHWFAOu+lxwNPujcsl8VYyTYYEZnsOO1WK4= +golang.org/x/exp v0.0.0-20231226003508-02704c960a9b/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4= golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -104,7 +104,7 @@ maunium.net/go/mauflag v1.0.0 h1:YiaRc0tEI3toYtJMRIfjP+jklH45uDHtT80nUamyD4M= maunium.net/go/mauflag v1.0.0/go.mod h1:nLivPOpTpHnpzEh8jEdSL9UqO9+/KBJFmNRlwKfkPeA= maunium.net/go/maulogger/v2 v2.4.1 h1:N7zSdd0mZkB2m2JtFUsiGTQQAdP0YeFWT7YMc80yAL8= maunium.net/go/maulogger/v2 v2.4.1/go.mod h1:omPuYwYBILeVQobz8uO3XC8DIRuEb5rXYlQSuqrbCho= -maunium.net/go/mautrix v0.16.3-0.20231219134117-a27bf782f377 h1:bMCEsm4V8NkDccd7TWxOUPyzPxHaA6FFGzFYZfsQE8g= -maunium.net/go/mautrix v0.16.3-0.20231219134117-a27bf782f377/go.mod h1:YL4l4rZB46/vj/ifRMEjcibbvHjgxHftOF1SgmruLu4= +maunium.net/go/mautrix v0.16.3-0.20231229201657-a21e5a272625 h1:yZkuRfA3R5vQOQ8IrxhCqHy0Iz0XtUand3IyCat1lMM= +maunium.net/go/mautrix v0.16.3-0.20231229201657-a21e5a272625/go.mod h1:gCgLw/4c1a8QsiOWTdUdXlt5cYdE0rJ9wLeZQKPD58Q= nhooyr.io/websocket v1.8.10 h1:mv4p+MnGrLDcPlBoWsvPP7XCzTYMXP9F9eIGoKbgx7Q= nhooyr.io/websocket v1.8.10/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= diff --git a/go.work.sum b/go.work.sum index ac77f7c0..7b535d7c 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,4 +1,5 @@ github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DATA-DOG/go-sqlmock v1.5.1/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU= github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= @@ -23,6 +24,8 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46 h1:veS9QfglfvqAw2e+eeNT/SbGySq8ajECXJ9e4fPoLhY= +github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= @@ -60,6 +63,7 @@ golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea h1:vLCWI/yYrdEHyN2JzIzPO3aaQ golang.org/x/exp v0.0.0-20230510235704-dd950f8aeaea/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20231219180239-dc181d75b848/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= @@ -72,6 +76,8 @@ golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6 h1:foEbQz/B0Oz6YIqu/69kfXPYeFQAuuMYFkjaqXzl5Wo= golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=